与えられた
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
思いますが、テンプレートに関するいくつかの例外がありますが、本当にそうでしょうか?ここでの標準の正式な規則は何ですか?