Ast*_*nog 2 c++ decltype effective-c++ c++11
我正在阅读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];
}
Run Code Online (Sandbox Code Playgroud)
然后它以这种方式使用该功能:
std::deque<int> d;
…
decltype_test_1(d, 5) = 10; // authenticate user, return d[5],
// then assign 10 to it;
// this won't compile!
Run Code Online (Sandbox Code Playgroud)
说它不会编译.我试过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;
Run Code Online (Sandbox Code Playgroud)
我不明白为什么它编译,最重要的是,它显示10为双端队列的第一个元素.他解释说这个代码是错误的.它为什么在这里工作?我错过了什么?
该评论不是关于具有尾随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];
}
Run Code Online (Sandbox Code Playgroud)
使用此版本,该示例将无法编译,因为该类型将推断为值而不是引用,因此您无法直接分配对函数的调用结果.
正如本书的下一页所示,在没有尾随返回类型的情况下获得正确类型的方法是使用decltype(auto)而不是auto.
template <typename Container, typename Index>
decltype(auto) decltype_test_1(Container& c, Index i)
{
return c[i];
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
290 次 |
| 最近记录: |