给定
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
与模板有关的一些豁免,但真的是这样 - 这里标准的正式规则是什么?