3

私の理解に基づいて、 auto で宣言された変数の型は、その初期化子から推測されます。

int main()
{
  unordered_map<string, int> dict;
  dict.insert({"a", 10});
  cout << dict["a"] << endl;

  auto iter = dict.find("a");
  if (iter != dict.end())
    iter->second = 30;

  cout << dict["a"] << endl;

  unordered_map<string, int>::iterator iterModify = dict.find("a");
  iterModify->second = 300;

  unordered_map<string, int>::const_iterator iterNonModify = dict.find("a");
  iterNonModify->second = 400; //  error: read-only variable is not assignable
}

上記の例では、ご覧のとおり、定義された変数の使用法に基づいて auto のタイプがさらに制限されているようで、そのiterタイプは ですunordered_map<string, int>::iterator。ただし、次の行がないと、コンパイラは auto の型をどのように正しく推測するのでしょうか?

質問>「autoで宣言された変数の型は、その初期化子だけから推測される」というのは本当ですか?その場合、なぜ iter の推定型が of なのunordered_map<string, int>::iteratorですか?

4

2 に答える 2

3

質問>「autoで宣言された変数の型は、その初期化子だけから推測される」というのは本当ですか?

はい。コンパイラは、その変数で次に何をするかを考慮しません。

したがって、次のようなコードを記述しようとすると、次のようになります。

auto x;
x = 5;

x宣言時に初期化子がないため、コンパイルされません。

Stroustrup 自身は、この機能を「auto -- イニシャライザから型を推定する」と説明しています。

編集:

その場合、なぜ iter の推定型が unordered_map::iterator なのですか?

それはunordered_map.find()の戻り値の型だからですauto iter = dict.find("a");

于 2013-06-27T02:37:06.447 に答える
3

autoとは異なりconstます。以下を定義できます。

const auto i = 5;
auto j = 5;
i = 6; //error const violation
j = 6; //OK

auto&同様に、const auto&auto&&volatile auto、 などを定義できます。

関数プロトタイプが 2 つあるため、mutable で定義した変数の性質にfind基づいていずれかを選択し、可変バージョンを選択します。const

C++ 標準言語では、cv-qualifier(const, volatile) とtype-specifier( auto, auto&, auto&&) に違いがあります。詳細については、セクション 7.1.6 を参照してください。 http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2012/n3337.pdf

于 2013-06-27T03:09:17.953 に答える