Использование ключевого слова шаблона перед именем зависимого шаблона ⇐ C++
Использование ключевого слова шаблона перед именем зависимого шаблона
Рассмотрев следующий пример кода, я ожидаю, что здесь придется использовать ключевое слово template, чтобы компилятор рассматривал переменную v как шаблон. Однако MSVC отвергает использование ключевого слова template, тогда как Clang и GCC фактически требуют его. Какое конкретное правило стандарта C++20 требует или запрещает использование ключевого слова template в этом случае?
struct s { шаблон статический constexpr auto v = true; }; // все ок static_assert([](auto x){ return decltype(x)::template v; }(s{})); // clang ок, gcc ок, msvc нет static_assert([](auto x){ return x.template v; }(s{})); // лязг нет, gcc нет, msvc ок static_assert([](auto x){ return x.v; }(s{})); Живой пример
Сообщение об ошибке от Clang:
:10:36: ошибка: используйте ключевое слово «шаблон» для обработки «v» как имя зависимого шаблона 10 | static_assert([](auto x){ return x.v; }(s{})); | ^ | шаблон Сообщение об ошибке от MSVC:
(8): ошибка C2187: синтаксическая ошибка: «шаблон» здесь был неожиданным (8): примечание: см. ссылку на создание экземпляра шаблона функции. 'auto ::operator ()(_T1) const' компилируется с [ _T1=с ]
Рассмотрев следующий пример кода, я ожидаю, что здесь придется использовать ключевое слово template, чтобы компилятор рассматривал переменную v как шаблон. Однако MSVC отвергает использование ключевого слова template, тогда как Clang и GCC фактически требуют его. Какое конкретное правило стандарта C++20 требует или запрещает использование ключевого слова template в этом случае?
struct s { шаблон статический constexpr auto v = true; }; // все ок static_assert([](auto x){ return decltype(x)::template v; }(s{})); // clang ок, gcc ок, msvc нет static_assert([](auto x){ return x.template v; }(s{})); // лязг нет, gcc нет, msvc ок static_assert([](auto x){ return x.v; }(s{})); Живой пример
Сообщение об ошибке от Clang:
:10:36: ошибка: используйте ключевое слово «шаблон» для обработки «v» как имя зависимого шаблона 10 | static_assert([](auto x){ return x.v; }(s{})); | ^ | шаблон Сообщение об ошибке от MSVC:
(8): ошибка C2187: синтаксическая ошибка: «шаблон» здесь был неожиданным (8): примечание: см. ссылку на создание экземпляра шаблона функции. 'auto ::operator ()(_T1) const' компилируется с [ _T1=с ]
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
-
Отсутствует «имя типа» перед именем зависимого типа только в Ubuntu Clang [дубликат]
Anonymous » » в форуме Linux - 0 Ответы
- 46 Просмотры
-
Последнее сообщение Anonymous
-