首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >尾随返回类型和rvalue

尾随返回类型和rvalue
EN

Stack Overflow用户
提问于 2015-09-07 13:04:10
回答 1查看 315关注 0票数 2

我正在阅读Scott的“有效的现代C++”,我正在我的机器上试用他为演绎类型章节提供的示例。

他提供这一职能:

代码语言:javascript
复制
template <typename Container, typename Index>
auto decltype_test_1(Container& c, Index i) -> decltype(c[i])
{
  return c[i];
}

然后它以这样的方式使用这个函数:

代码语言:javascript
复制
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中写了以下内容

代码语言:javascript
复制
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的第一个元素。因为他解释的这个代码是错误的。为什么在这里起作用?我遗漏了什么?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-09-07 13:14:04

该注释不是关于带尾解密类型的C++11示例的,而是关于带有auto类型演绎的C++14版本的:

代码语言:javascript
复制
template <typename Container, typename Index>
auto decltype_test_1(Container& c, Index i) //no trailing return
{
  return c[i];
}

使用此版本,示例将无法编译,因为类型将被推断为值而不是引用,因此不能直接将调用结果分配给函数。

正如这本书的下一页所指出的那样,要获得正确的类型而不使用尾随返回类型,方法是使用decltype(auto)而不是auto

代码语言:javascript
复制
template <typename Container, typename Index>
decltype(auto) decltype_test_1(Container& c, Index i)
{
  return c[i];
}
票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32439493

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档