3

给定

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

4

1 回答 1

4

引用 C++11、8.3.2/1:

... cv 限定的引用格式错误,除非通过使用 typedef (7.1.3) 或模板类型参数 (14.3) 引入 cv 限定符,在这种情况下忽略 cv 限定符。...

于 2015-03-17T15:12:09.640 回答