У меня есть шаблон функции f, определяющий в своем теле локальный класс A с другим вложенным классом B. Оба класса не являются шаблонами. Должен ли я назвать внутренний класс именем типа A::B или более коротким вариантом A::B тоже можно?
Вот упрощенный код:
template
void f() {
struct A{ struct B{}; };
// ok everywhere
auto b = typename A::B();
b = typename A::B{};
// ok in EDG and MSVC
b = A::B();
// ok in EDG only
b = A::B{};
}
int main() {
f();
}
Все компиляторы принимают имя типа A::B.
Построение объекта с помощью A::B() не нравится Clang и GCC, которые жалуются
error: missing 'typename' prior to dependent type name 'A::B'
error: dependent-name 'f()::A::B' is parsed as a non-type, but instantiation yields a type
И только EDG принимает построение объектов с помощью A::B{, тогда как Clang, GCC и MSVC выводят аналогичные ошибки:
У меня есть шаблон функции f, определяющий в своем теле локальный класс A с другим вложенным классом B. Оба класса не являются шаблонами. Должен ли я назвать внутренний класс именем типа A::B или более коротким вариантом A::B тоже можно? Вот упрощенный код: [code]template void f() { struct A{ struct B{}; };
// ok everywhere auto b = typename A::B(); b = typename A::B{};
// ok in EDG and MSVC b = A::B();
// ok in EDG only b = A::B{}; }
int main() { f(); } [/code] [list] [*]Все компиляторы принимают имя типа A::B. [*]Построение объекта с помощью A::B() не нравится Clang и GCC, которые жалуются [/list] [code]error: missing 'typename' prior to dependent type name 'A::B' error: dependent-name 'f()::A::B' is parsed as a non-type, but instantiation yields a type [/code] [list] [*]И только EDG принимает построение объектов с помощью A::B{, тогда как Clang, GCC и MSVC выводят аналогичные ошибки: [/list] [code]error: expected ';' after expression error: expected ';' before '{' token [-Wtemplate-body] error C2760: syntax error: '{' was unexpected here; expected 'expression' [/code] Онлайн-демо Какая реализация здесь правильная?