首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >是否可以忽略c++11的后继返回类型特性,而更倾向于c++14的函数返回类型推断特性?

是否可以忽略c++11的后继返回类型特性,而更倾向于c++14的函数返回类型推断特性?
EN

Stack Overflow用户
提问于 2014-08-16 14:58:43
回答 1查看 460关注 0票数 12

跳过表达式的返回类型时

C++11中的下列代码

代码语言:javascript
复制
auto function(X x, Y y) -> decltype(x + y)
{
    return x + y;
}

等于C++14中的下列代码

代码语言:javascript
复制
decltype(auto) function(X x, Y y)
{
    return x + y;
}

但是,在C++14中,可以不使用C++14规则推断返回类型。

代码语言:javascript
复制
auto function()
{
    return 0;
}

当我知道返回类型是什么的时候

C++11中的下列代码

代码语言:javascript
复制
auto function() -> int
{
    return 0;
}

等于C++03中的下列代码

代码语言:javascript
复制
int function()
{
    return 0;
}

一个不应该发生的奇怪的例子

C++11中的下列代码

代码语言:javascript
复制
auto function(X x, Y y) -> decltype(x * y)
{
    return x; // Yeah! return x with the type of x * y expression!
}

等于C++14中的下列代码

代码语言:javascript
复制
decltype(auto) function(X x, Y y)
{
    return static_cast<decltype(x * y)>(x);
}

请纠正我,如果上面的代码是错误的,并没有按照预期的工作。

编辑,根据注释(Yakk):它们实际上并不相等,第一个(__C++11示例)是隐式强制转换,而第二个( static_cast of C++14示例)是显式强制转换。

结论

正如您所看到的,我可以不使用C++11的其他函数语法特性来做任何事情。我说的对吗?我能完全忘记它而不遇到任何技术问题吗?

一般而言,可以避免使用以下语法:

代码语言:javascript
复制
auto function() -> TYPE
{
    return 0;
}

支持以下语法:

代码语言:javascript
复制
TYPE function() // TYPE can be: auto, decltype(auto), or ...
{
    return 0;
}

我是否忘记了C++11的尾随返回类型特性的任何用法,而这与C++14的函数返回类型演绎功能是不可能的?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-08-16 15:06:59

使用自动返回类型演绎的函数与具有显式返回类型的函数之间有三个重要区别(即使这是计算出来的):

  1. 如果没有显式指定返回类型的可计算性,就不能对它执行SFINAE :您将得到一个硬错误。为什么?因为SFINAE只适用于声明,而不是函数的定义(SFINAE:(模板-参数)替换-失败不是错误)。 自动返回式扣减,无SFINAE SFINAE,但没有自动返回类型扣减。 #包括int doit(int x,.){ template auto ( X,y) #ifdef TRAILING_RETURN_TYPE ->解密类型( doit(x) + doit(y)) #endif {返回doit(X )+ doit(y);} int main() {std:cout << doit(1,nullptr) << "\n";}
  2. 目前,如果定义使用自动返回类型演绎,则不能转发-声明具有其实际返回类型的函数,也不能是虚拟的。(明文规定) 7.1.6.4自动说明符[dcl.spec.auto] 13使用占位符类型声明返回类型的函数或函数模板的Redeclarations或专门化也应使用该占位符,而不是推断类型。 14用使用占位符类型的返回类型声明的函数不应是虚拟的(10.3)。
  3. 只有具有自动返回类型演绎的函数才能返回lambda,因为没有其他方法可以获得它的类型。 自动foo() {返回[] {};}

链接到该提案,该提案已被纳入C++14草案:

http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2013/n3638.html

票数 15
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25341378

复制
相关文章

相似问题

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