鉴于
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
中的调用编译的原因相同,是模板的一些豁免,但实际上是这样 - 标准的正式是什么规则在这里?
答案 0 :(得分:4)
引用C ++ 11,8.3.2 / 1:
...除非通过使用typedef(7.1.3)或模板类型参数(14.3)引入cv限定符,否则Cv限定引用的格式不正确,在这种情况下cv限定符 被忽略了。 ...