模板形参重新定义默认实参

C++11: template parameter redefines default argument

本文关键字:定义 默认 实参 形参 新定义      更新时间:2023-10-16

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

template< typename T = int > T func( );
template< typename T = int > T func( );

当我用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.

编译命令

[clang++|g++] -Wall -Werror -std=c++11 redeftempparam.cc

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

我的问题:

允许这种类型的重定义吗?如果没有:你能给我指出c++标准中合适的地方吗?

§14.1.12:

一个模板形参不能由同一作用域内的两个不同声明提供默认实参。

(例子:

template<class T = int> class X;
template<class T = int> class X { /∗... ∗/ }; // error

- end示例]