首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >对于自动类型推导的参数,解密型(Auto)应该推导什么?

对于自动类型推导的参数,解密型(Auto)应该推导什么?
EN

Stack Overflow用户
提问于 2017-04-20 09:16:08
回答 1查看 264关注 0票数 3

我认为这两个函数应该具有相同的返回类型:

代码语言:javascript
复制
template<class T>
decltype(auto) f(T&& a){return a;}
decltype(auto) g(auto&& a){return a;}

然而,使用gcc7,这些函数可以验证:

代码语言:javascript
复制
int i;
static_assert(std::is_same< decltype(f(i)), int& >::value);
static_assert(std::is_same< decltype(g(i)), int  >::value);

为什么g和f的返回类型不同?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-04-20 09:22:41

定义

代码语言:javascript
复制
decltype(auto) g(auto&& a){return a;}

不是标准C++。它可能是即将推出的概念Lite特性的一部分。g++将语法作为扩展提供(即使没有-fconcepts__)。

实际上,用-Wpedantic编译会产生一个警告:

代码语言:javascript
复制
warning: ISO C++ forbids use of 'auto' in parameter declaration [-Wpedantic]
 decltype(auto) g(auto&& a){return a;}
                  ^~~~

由于行为还没有标准化,所以还不清楚您的static_assert是否应该是真实的--直觉上我同意decltype(g(i))应该是int&。这可能只是g++如何实现非成员函数auto参数的“缺陷”。

与您试图做的最接近标准的事情是lambda表达式

代码语言:javascript
复制
auto z = [](auto&& a) -> decltype(auto) { return a; };

z的情况下,static_assert按预期工作:

代码语言:javascript
复制
static_assert(std::is_same< decltype(z(i)), int&  >::value);
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43515229

复制
相关文章

相似问题

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