2015-09-07 73 views
2

我在阅读Scott Meyers的Effective Modern 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

它看起来像有使用'decltype',他说,它工作正常,其次是一个例子,而不'decltype'他说,这是不完全正确的例子。函数调用是后者的一部分。当然,还有第三种是“decltype(auto)”。 – chris

+0

你的第二个片段调用函数'authAndAccess',而第一个片段定义'decltype_test_1'。我没有这本书,因此我不知道它是否是一个错字... – user463035818

回答

6

这番话是不是与后decltype的C++ 11例,它是关于C++ 14版本auto类型推演:

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]; 
} 
+0

所以在C++ 11的情况下,'decltype(c [i])'将返回对'c [i]'的引用' , 我对吗? – Astinog

+1

@Agostino确实,看看[这个例子]的编译器错误(http://coliru.stacked-crooked.com/a/4e55a5cbdf7f46b7),看看有什么不同。 – TartanLlama

+0

非常感谢。只是一件事,与这个问题没有关系,但我想知道'template struct tt;'的意思,我可以在哪里读到它?你能提供一个链接吗?再次感谢 – Astinog