尾随返回类型和右值 我正在阅读Scott Meyers的现代C++,我正在尝试我的机器,他提供了演绎类型的例子。

尾随返回类型和右值 我正在阅读Scott Meyers的现代C++,我正在尝试我的机器,他提供了演绎类型的例子。,c++,c++11,decltype,effective-c++,C++,C++11,Decltype,Effective C++,他提供以下功能: template <typename Container, typename Index> auto decltype_test_1(Container& c, Index i) -> decltype(c[i]) { return c[i]; } 我不明白它为什么要编译,最重要的是,它将10显示为deque的第一个元素。因为他解释的代码是错误的。为什么它在这里工作?我遗漏了什么?该评论不是关于带有尾部decltype的C++11示例,而是关于带

他提供以下功能:

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

我不明白它为什么要编译,最重要的是,它将
10
显示为deque的第一个元素。因为他解释的代码是错误的。为什么它在这里工作?我遗漏了什么?

该评论不是关于带有尾部decltype的C++11示例,而是关于带有
自动
类型推断的C++14版本:

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

看起来有一个例子是关于
decltype
的,他说它很好用,接着是一个没有
decltype
的例子,他说它不太正确。函数调用是后者的一部分。当然,还有第三个是
decltype(auto)
。您的第二个代码段调用函数
authAndAccess
,而第一个代码段定义
decltype\u test\u 1
。我没有这本书,因此我不知道它是否是打字错误…因此在C++11的情况下,
decltype(C[I])
将返回对
C[I]
的引用,对吗?@Agostino确实,请查看编译器错误以了解差异。非常感谢。只有一件事,与问题无关,但我想知道什么是
template struct tt意味着,我在哪里可以阅读有关它的信息?你能提供一个链接吗?谢谢again@Agostino这只是一种让编译器通过声明一个类模板而从不定义它来向您展示它所推导的类型的方法。梅耶斯实际上在你正在阅读的书的第4项中展示了一种类似的方法。
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;
template <typename Container, typename Index>
auto decltype_test_1(Container& c, Index i) //no trailing return
{
  return c[i];
}
template <typename Container, typename Index>
decltype(auto) decltype_test_1(Container& c, Index i)
{
  return c[i];
}