我正在阅读Scott的“有效的现代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显示为deque的第一个元素。因为他解释的这个代码是错误的。为什么在这里起作用?我遗漏了什么?
发布于 2015-09-07 13:14:04
该注释不是关于带尾解密类型的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];
}https://stackoverflow.com/questions/32439493
复制相似问题