В этом примере последняя строка не компилируется. Я понимаю почему, но мне интересно, как я могу заставить компилятор понять, что я хочу вызвать Class(const int &)
для создания безымянного экземпляра, вместо того, чтобы пытаться вызвать неопределенный конструктор по умолчанию и создать экземпляр с именем i
:
struct Class {
Class(const int &) {}
};
void foo() {
int i;
// Works
Class(int(i));
// Fails
Class(i);
}
Ошибка в MSVC:
C2371 'i': redefinition; different basic types
E0291 no default constructor exists for class "Class"
Не это ли известный «самый досадный разбор»?
@ChrisMM, если ты прочитаешь последнюю строчку моего вопроса, ты увидишь, что я это знаю. Мой вопрос в том, как мне этого избежать.
Если вы это смотрели... youtu.be/7DTlWPgX6zs?si=5M58eI7XwpZbKYax
@FridayPie Я только что это сделал, но теперь мне бы хотелось этого не делать...
Вам нужно использовать инициализацию фигурных скобок, чтобы грамматика не думала, что вы пытаетесь создать объект с именем i
типа Class
. Для тебя это означает
Class{i};
создаст безымянный временный объект, который будет уничтожен в конце полного выражения.
Другой вариант: (Class(i));
В некоторых случаях (не в вашем) фигурные скобки могут иметь иную семантику, чем круглые скобки, и я бы предпочел не думать об этом в целом.
Второй не вызывает конструктор
Class
, он создает переменную с именемi
типаClass
.