尾随返回类型和右值

时间:2015-09-07 13:04:11

标签: c++ c++11 decltype effective-c++

我正在阅读Scott Meyers的有效的现代C ++ ,并且我在我的机器上尝试了他为演绎类型提供的示例章。

他提供这个功能:

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作为双端队列的第一个元素。他解释说这个代码是错误的。它为什么在这里工作?我错过了什么?

1 个答案:

答案 0 :(得分: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];
}