Clang vs MSVC: обработка прототипов шаблонных функций

Ниже приводится фрагмент тестового кода, и я сравниваю результат его компиляции с MSVC и Clang соответственно. Вывод каждого компилятора показан ниже. MSVC делает вид, что неиспользованного объявления шаблона даже не существует. Clang выдает ошибку. Вопрос в том, какой компилятор здесь наиболее соответствует стандарту?

Я видел унаследованный производственный код, который полагается на поведение MSVC, и я не уверен, можно ли и дальше полагаться на него.

class S
{
    struct P {};
};

template<typename T>
S::P Bat(T);

Компилируется чисто в MSVC10:

E:\clangbuild\bin\Release>cl /c /nologo test.cpp
test.cpp

Выдает ошибку в Clang:

E:\clangbuild\bin\Release>clang++ test.cpp
test.cpp:9:4: error: 'P' is a private member of 'S'
S::P Bat(T);
   ^
test.cpp:5:9: note: implicitly declared private here
struct P {};
        ^
1 error generated.
11
задан brendanw 16 February 2012 в 00:33
поделиться