2017-02-16 6 views
1

배열에 Nullable 구조체를 추가하려고하면 인덱스를 사용하여 배열에 할당 할 때이를 캐스팅해야하지만 캐스팅해야합니다. 이 버그입니까, 아니면이 방법으로 작동할까요?Nullable 형식의 배열에 추가

import std.typecons; 

struct Foo { 
    string s; 
    int i; 
} 

void main() { 
    f1(); 
    f2(); 
    f3(); 
} 

void f1() { 
    auto foos = new Nullable!Foo[](10); 
    foos[0] = Foo("abc", 10); // OK 
} 

void f2() { 
    Nullable!Foo[] foos; 
    foos ~= Foo("abc", 10); // Error: cannot append type Foo to type Nullable!(Foo)[] 
}  

void f3() { 
    Nullable!Foo[] foos; 
    foos ~= cast(Nullable!Foo)Foo("abc", 10); // OK 
} 

답변

3

저는 이상적이라고 말하고 싶지만 의도적입니다. D는 함축적 인 구조가 없다 (하나의 정말로 애매한 경우를 제외하고, 호기심이 있다면 variadic 클래스 함수를 제외하고). 그리고 당신이 요구하는 것은 Nullable의 암시 적 생성이다. Foo를 사용하면 Nullable 래퍼를 만들고 싶다. 그리고 D는 명시 적 액션, 디렉터 생성자 호출 또는 하나처럼 작동하는 함수 호출 없이는 그렇게 할 수 없습니다. (일부 사용자 정의 배열에서는 오버로드 된 concat 연산자가 구조를 수행하지만 내장 배열을 사용하므로 과부하가 발생하지 않습니다).

할당 한 경우 이미 구성된 항목에서 Nullable!T.opAssign을 호출합니다. 내용을 대체하는 http://dpldocs.info/experimental-docs/std.typecons.Nullable.opAssign.html 유형으로 구현 된 오버로드 된 함수.

그러나 연결은이 구성 규칙에 맞는 새로운 요소를 만들어야 함을 의미합니다.

나는 D가이 기능을 가지고 있었으면 좋겠다고 생각하기 때문에 이상하지 않다. C++에는 암시 적 생성자에 대한 나쁜 경험이 있었지만, explicit 키워드를 명시 적으로 사용하지 않으면 모든 C++ 생성자가 기본적으로 암시 적이기 때문에 발생합니다. D는 그런 실수를 피할 수 있지만, 목욕물 :(함께 아기를 던졌다

구조체에 값 v 주조

S (V)

: 값이 동일한 타입의 구조체없는 S는 동등하다