2

Scott Meyers の『Effective Modern C++ 』を読んでいて、 Deducing Typesの章で彼が提供している例を自分のマシンで試しています。

彼はこの機能を提供します:

template <typename Container, typename Index>
auto decltype_test_1(Container& c, Index i) -> decltype(c[i])
{
  return c[i];
}

そして、この関数を次のように使用します。

std::deque<int> d;
…
decltype_test_1(d, 5) = 10; // authenticate user, return d[5],
                          // then assign 10 to it;
                          // this won't compile!

コンパイルされないと言っています。MSVC で試してみたところ、コンパイルできました。に次のように書きましたmain

std::deque<int> d;
d.push_back(0);
d.push_back(1);
d.push_back(2);

decltype_test_1(d, 0) = 10;

for each (auto item in d)
  cout << item << endl;

それがコンパイルされる理由がわかりません。何よりも10、両端キューの最初の要素として表示されます。彼の説明によると、このコードは間違っています。なぜここで機能するのですか?私は何が欠けていますか?

4

1 に答える 1

6

そのコメントは、末尾の decltype を使用した C++11 の例に関するものではなく、auto型推定を使用した C++14 バージョンに関するものです。

template <typename Container, typename Index>
auto decltype_test_1(Container& c, Index i) //no trailing return
{
  return c[i];
}

このバージョンを使用すると、型が参照ではなく値として推定されるため、この例はコンパイルに失敗します。そのため、関数の呼び出しの結果に直接代入することはできません。

本の次のページに示されているように、末尾の戻り値の型なしで正しい型を推定する方法は、decltype(auto)代わりに を使用することですauto

template <typename Container, typename Index>
decltype(auto) decltype_test_1(Container& c, Index i)
{
  return c[i];
}
于 2015-09-07T13:14:04.423 に答える