什么是C ++ const引用的形式(不是对const的引用,而是const引用)

时间:2015-03-17 15:05:48

标签: c++ templates c++11 language-lawyer template-aliases

鉴于

template< class Type >
void constref( Type const ) {}

void constref_call() { double x; constref<double&>( x ); }      // OK

template< class Type >
using reference = Type&;

void foo( reference< const int > const x ) { (void) x; }        // OK

template< class Type >
void foot( reference< const Type > arg ) { (void) arg; }

void foot_call() { foot( 3.14 ); }      // Deduces arg type no problem.

void foo2( int const& const x ) { (void) x; }                   // !

使用Visual C ++和g ++,此代码将按照注释中的说明进行编译,只有foo2会引发编译错误。

我本来希望foo同样导致编译错误,以便能够使用与核心语言的“失败实验”运算符表示法相同的约束符号。

我怀疑foo编译的原因与constref_call中的调用编译的原因相同,是模板的一些豁免,但实际上是这样 - 标准的正式是什么规则在这里?

1 个答案:

答案 0 :(得分:4)

引用C ++ 11,8.3.2 / 1:

  

...除非通过使用typedef(7.1.3)或模板类型参数(14.3)引入cv限定符,否则Cv限定引用的格式不正确,在这种情况下cv限定符   被忽略了。 ...