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. ...