Неоднозначные конструкторы структур в D

#constructor #struct #initialization #d #ambiguity

#конструктор #структура #инициализация #d #неоднозначность

Вопрос:

У меня возникли некоторые проблемы с пониманием того, как бороться с неоднозначностью конструкторов в D.

 struct mydta {
    int a = 2;
    int b = 3;

    this(int c) {
        a = c / 2;
        b = c * 2;
    }
    this(float c) {
        a = cast(int) c / 2;
        b = cast(int) c * 2;
    }

    static mydta afvec = mydta(4.3);
    static mydta aivec = mydta(5);
}
  
  • afvec имеет значения данных 2 и 8.
  • aivec имеет значения данных 5 и 3.

Это означает, что afvec вызывается this(float c) так, как ожидается из синтаксиса.

Однако aivec было выполнено назначение, аналогичное aivec.a = 5 .

Я экстраполировал это, чтобы обнаружить, что следующее является законным в приведенном выше: aivec = mydta(5, 4); присвоение aivec значений 5 и 4 соответственно.

Есть идеи, как обойти эту неявную инициализацию, чтобы я мог получить доступ к своему конструктору: this(int c) ?

Комментарии:

1. Число с плавающей точкой также может быть равно 5, поэтому оно не знает, какой конструктор использовать. Попробуйте добавить приведение к одному из них.

2. Проблема не в этом, проблема в том, что если я использую int, он вызывает некоторую неявную инициализацию вместо this(int c) конструктора, который я хочу, чтобы он вызывался.

Ответ №1:

Для меня это выглядит как ошибка.

Если вы сделаете это:

 mydta foo = mydta(5);
writeln(foo.b);
  

Вы получаете 10 , как и ожидалось. В CTFE было внесено много изменений для версии 2.053, так что в результате что-то могло быть сломано. Пожалуйста, опубликуйте это как ошибку в системе отслеживания проблем D.

Комментарии:

1. Ваше право, это происходит только для статической переменной и работает в других ситуациях. Спасибо.