C++ 11:模板参数重新定义默认参数

And*_*ath 8 c++ templates default-value c++11

使用gcc编译以下源代码时,没有错误/警告:

template< typename T = int > T func( );
template< typename T = int > T func( );
Run Code Online (Sandbox Code Playgroud)

当我使用clang ++编译相同的源代码时,我收到以下错误:

redeftempparam.cc:2:24: error: template parameter redefines default argument
template< typename T = int > T func( );
                       ^
redeftempparam.cc:1:24: note: previous default template argument defined here
template< typename T = int > T func( );
                       ^
1 error generated.
Run Code Online (Sandbox Code Playgroud)

要编译的命令

[clang++|g++] -Wall -Werror -std=c++11 redeftempparam.cc
Run Code Online (Sandbox Code Playgroud)

(版本信息:gcc 4.7.2,clang version 3.3(trunk 171722))

我的问题:

是否允许这种重新定义?如果没有:你能指点我C++标准中的适当点吗?

Bar*_*icz 12

§14.1.12:

模板参数不应由同一范围内的两个不同声明给出默认参数.

[例:

template<class T = int> class X;
template<class T = int> class X { /?... ?/ }; // error
Run Code Online (Sandbox Code Playgroud)

- 结束例子]

  • 这意味着:不允许和clang ++是正确的.非常感谢你! (3认同)