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 修飾された参照は、型定義 (7.1.3) またはテンプレート型引数 (14.3) を使用して cv 修飾子が導入された場合を除き、形式が正しくありません。この場合、cv 修飾子は無視されます。...

于 2015-03-17T15:12:09.640 に答える