Информация об изменениях

Сообщение Re: Смысл явного дублирования имени класса через typedef от 29.06.2021 19:46

Изменено 29.06.2021 20:33 watchmaker

Re: Смысл явного дублирования имени класса через 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 позволяет получить ошибку компиляции вместо WTF.
Re: Смысл явного дублирования имени класса через 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 позволяет получить ошибку компиляции вместо ошибки во время исполнения программы.