1

Scott Meyers の「Effective modern C++」を読んでいます。項目 1 には、次の例が含まれています。

template<typename T>
void f(T& param);       // param is a reference
int x = 27;             // x is an int
const int cx = x;       // cx is a const int
f(cx);                  // T is const int,
                        // param's type is const int&

項目 3 には、次の例が表示されます。

Widget w;
const Widget& cw = w;
auto myWidget1 = cw;             // auto type deduction:
                                 // myWidget1's type is Widget

項目 1 に基づいて、私はmyWidget1のタイプが であると予想しましconst Widgetた。何か不足していますか?

4

2 に答える 2

3

ほとんどの場合auto、テンプレート引数推定の規則に従います。

§ 7.1.6.4 [dcl.spec.auto]/p6:

declarator-idの型が 8.3 に従って決定されると、declarator-idを使用して宣言された変数の型は、テンプレート引数推論の規則を使用して初期化子の型から決定されます。変数T識別子に対して決定された型としますd。の出現箇所を新しく考案された型テンプレート パラメータに置き換えるか、イニシャライザが波括弧初期化リスト(8.5.4)の場合はに置き換えることによって、Pから取得します。変数に対して推定された型は、関数呼び出しからのテンプレート引数推定の規則を使用して決定された推定されます (14.8.2.1)。TautoUstd::initializer_list<U>dA

§ 14.8.2.1 [temp.deduct.call]/p2:

Pが参照型でない場合:

  • [...]

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

myWidget1typeにしたい場合はconst Widget&、参照型として宣言する必要があります。

auto& myWidget1 = cw;
//  ^

デモ

于 2015-08-07T08:44:26.643 に答える