重複の可能性:
右辺値引数からの const への参照の推定
私が持っている場合
template<class T>
void foo(T &) { }
foo((const int)5)
引数が であることを考えると、const int
なぜコンパイラは自動的に であると推論T
しないのconst int
でしょうか?
重複の可能性:
右辺値引数からの const への参照の推定
私が持っている場合
template<class T>
void foo(T &) { }
foo((const int)5)
引数が であることを考えると、const int
なぜコンパイラは自動的に であると推論T
しないのconst int
でしょうか?
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 によって提供されるコードはコンパイルさえしません。
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&
右辺値で初期化できない を受け取ります。)