#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. Ваше право, это происходит только для статической переменной и работает в других ситуациях. Спасибо.