Рассмотрим следующий код:
template <typename T = int> struct X {};
extern X foo;
X foo;
Live на gcc.godbolt.org
Я ожидаю, что он будет правильно сформирован, но GCC, Clang и MSVC отклоняют его с помощью следующих сообщений об ошибках:
GCC 8.2 (с -std=c++17 -Wall -Wextra -pedantic-errors
):
<source>:3:3: error: conflicting declaration 'X foo'
X foo;
^~~
<source>:2:10: note: previous declaration as 'X<int> foo'
extern X foo;
^~~
Clang 7.0.0 (с-std=c++17 -Wall -Wextra -pedantic-errors
):
<source>:2:10: error: declaration of variable 'foo' with deduced type 'X' requires an initializer
extern X foo;
^
MSVC Pre 2018 (с /std:c++latest
):
<source>(2): error C2641: cannot deduce template argument for 'X'
<source>(3): error C2133: 'foo': unknown size
<source>(3): error C2641: cannot deduce template argument for 'X'
Теперьинтересная часть.
Этот фрагмент принят Clang, но отклонен GCC & MSVC:
extern X<> foo;
X foo;
И этот фрагмент принят GCC, но отклонен Clang & MSVC:
extern X foo;
X<> foo;
Этот принят всеми тремя компиляторами:
extern X<> foo;
X<> foo;
И, наконец, этот принят GCC & Clang, но отклонен MSVC:
X foo;
Чтоздесь происходит?Какие из этих пяти фрагментов верны?