以下是一段测试代码,我将分别编译它的结果与MSVC和Clang进行比较.每个编译器的输出如下所示.MSVC假装未使用的模板声明甚至不存在.Clang产生错误.问题是,哪个编译器最符合标准?
我已经看到依赖于MSVC行为的遗留生产代码,我不确定它是否可以继续依赖.
class S
{
struct P {};
};
template<typename T>
S::P Bat(T);
Run Code Online (Sandbox Code Playgroud)
在MSVC10中干净地编译:
E:\clangbuild\bin\Release>cl /c /nologo test.cpp
test.cpp
Run Code Online (Sandbox Code Playgroud)
在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.
Run Code Online (Sandbox Code Playgroud)