7

重複の可能性:
右辺値引数からの const への参照の推定

私が持っている場合

template<class T>
void foo(T &) { }

foo((const int)5)引数が であることを考えると、const intなぜコンパイラは自動的に であると推論Tしないのconst intでしょうか?

4

2 に答える 2

8

C++03 標準の 2.12.1.2 節によると、整数リテラルの型はintではなくです。const int

整数リテラルの型は、その形式、値、および接尾辞によって異なります。10 進数で接尾辞がない場合は、その値を表すことができるこれらの型の最初のものを持ちます: int、long int;...

アップデート

関連する別の型推論規則は 14.8.2.1.2 かもしれません。

P が参照型でない場合:

[...]

— A が cv 修飾された型の場合、A の型の最上位の cv 修飾子は型推定では無視されます。

P が cv 修飾された型の場合、P の型の最上位の cv 修飾子は型推定では無視されます。

P が参照型の場合、P によって参照される型が型推定に使用されます。

非 const 参照を右辺値にバインドすることは違法であるため、OP によって提供されるコードはコンパイルさえしません。

于 2012-08-13T09:36:46.030 に答える
7

const 型が指定されている場合はそうです。ただし、非クラス型の右辺値 (C++11 の prvalues) は、たとえそうであると言おうとしても、決して cv 修飾されません: 式((const int)5)には type がありintます。ここでの理由は、cv 修飾はオブジェクトにのみ適用され、非クラス型の一時型はオブジェクトではなく純粋な値であるということです。constまたはになるものが何もないため、cv-qualifications は適用できませんvolatile

あなたが書く場合:

int const i = 42;
foo( i );

、テンプレートは でインスタンス化されT = int constます。(あなたが書いたように、推定された型は であるため、コードはコンパイルされるべきではありませんint。そのため、関数はint&右辺値で初期化できない を受け取ります。)

于 2012-08-13T10:05:06.930 に答える