2016-06-04 11 views
3

В D я могу инициализировать непосредственно в декларации и ожидать, что выражения инициализатора являются частью конструктора? Я пришел с C#, и вот это случай. Но с DMD 2.071.0 Im получает другое поведение.Являются ли инициализаторы выражения частью конструктора в D?

class Other { } 

class Test { Other nonStaticMember = new Other; } 

void test() 
{ 
    auto t1 = new Test; 
    auto t2 = new Test; 
    // Assert is failing, the two Test instances are 
    // being initialized to the same reference 
    // instead of execute the Other constructor twice. 
    assert(t1.nonStaticMember !is t2.nonStaticMember); 
} 

Если это intented поведение должно быть документировано здесь: https://dlang.org/spec/class.html правильно?

ответ

5

Этот код не делает в D, что он сделал бы на C#.

В вашем примере создается Otherво время компиляции.

I.e. Other создается один раз, во время компиляции и помещается в сегмент данных программы. Затем начальное значение nonStaticMember будет по умолчанию указывать на этот экземпляр Other для всех экземпляров Test.

Итак, все работает точно так же, как и при проектировании, даже если это может быть удивительно при выходе с других языков.

Если это намеренное поведение, оно должно быть задокументировано здесь: https://dlang.org/spec/class.html Право?

Возможно, обратите внимание, что это поведение совсем не относится к классам. Указатель на любое значение, выделенное в куче, как начальное значение глобальной или локальной статической переменной, будет вести себя одинаково. Всякий раз, когда во время компиляции требуется значение выражения (и которое включает инициализаторы для глобальных/статических переменных), D пытается оценить его во время компиляции. Несколько лет назад это было расширено и для выделения значений в «куче», которые затем попадают в начальный сегмент данных программы.

 Смежные вопросы

  • Нет связанных вопросов^_^