C++ const reference的形式是什么(不是对const的引用,而是const引用)
What's the formal of C++ const reference (not reference to const, but const reference)
给出
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
中的调用编译的原因相同,一些豁免与模板有关,但真的如此 - 什么是标准的正式规则在这里?
引用 C++11、8.3.2/1:
... Cv-qualified references are ill-formed except when the cv-qualifiers are introduced through the use of a typedef (7.1.3) or of a template type argument (14.3), in which case the cv-qualifiers
are ignored. ...
给出
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
中的调用编译的原因相同,一些豁免与模板有关,但真的如此 - 什么是标准的正式规则在这里?
引用 C++11、8.3.2/1:
... Cv-qualified references are ill-formed except when the cv-qualifiers are introduced through the use of a typedef (7.1.3) or of a template type argument (14.3), in which case the cv-qualifiers are ignored. ...