Сообщение Re: Смысл явного дублирования имени класса через typedef от 29.06.2021 19:46
Изменено 29.06.2021 20:33 watchmaker
Re: Смысл явного дублирования имени класса через typedef
Здравствуйте, Евгений Музыченко, Вы писали:
ЕМ> В каких случаях имя класса в C++ может не являться именем типа?
Разумеется в случае, когда это имя является именем чего-то другого. Например, именем функции:
Демо: https://godbolt.org/z/c31vh54xv — если убрать typedef, то программа компилируется, но её поведение кардинально меняется от наличия объявления функции (второй define примера). И такое объявление функции в реальности будет не лежать рядом с классом, а приедет через пять транзитивных #include из C-кода.
А typedef позволяет получить ошибку компиляции вместо WTF.
ЕМ> В каких случаях имя класса в C++ может не являться именем типа?
Разумеется в случае, когда это имя является именем чего-то другого. Например, именем функции:
#if 1
class foo;
#else
typedef class foo foo;
#endif
const char* foo() {
return "fn";
}
Демо: https://godbolt.org/z/c31vh54xv — если убрать typedef, то программа компилируется, но её поведение кардинально меняется от наличия объявления функции (второй define примера). И такое объявление функции в реальности будет не лежать рядом с классом, а приедет через пять транзитивных #include из C-кода.
А typedef позволяет получить ошибку компиляции вместо WTF.
Re: Смысл явного дублирования имени класса через typedef
Здравствуйте, Евгений Музыченко, Вы писали:
ЕМ> В каких случаях имя класса в C++ может не являться именем типа?
Разумеется в случае, когда это имя является именем чего-то другого. Например, именем функции:
Демо: https://godbolt.org/z/c31vh54xv — если убрать typedef, то программа компилируется, но её поведение кардинально меняется от наличия объявления функции (второй define примера). И такое объявление функции в реальности будет не лежать рядом с классом, а приедет через пять транзитивных #include из C-кода.
А typedef позволяет получить ошибку компиляции вместо ошибки во время исполнения программы.
ЕМ> В каких случаях имя класса в C++ может не являться именем типа?
Разумеется в случае, когда это имя является именем чего-то другого. Например, именем функции:
#if 1
class foo;
#else
typedef class foo foo;
#endif
const char* foo() {
return "fn";
}
Демо: https://godbolt.org/z/c31vh54xv — если убрать typedef, то программа компилируется, но её поведение кардинально меняется от наличия объявления функции (второй define примера). И такое объявление функции в реальности будет не лежать рядом с классом, а приедет через пять транзитивных #include из C-кода.
А typedef позволяет получить ошибку компиляции вместо ошибки во время исполнения программы.