是否可以忽略c ++ 11的尾随返回类型功能,而不是c ++ 14的函数返回类型推导功能?

M. *_* E. 12 c++ c++11 trailing-return-type return-type-deduction c++14

当我跳过表达式的返回类型时

C++ 11中的以下代码:

auto function(X x, Y y) -> decltype(x + y)
{
    return x + y;
}
Run Code Online (Sandbox Code Playgroud)

等于C++ 14中的以下代码:

decltype(auto) function(X x, Y y)
{
    return x + y;
}
Run Code Online (Sandbox Code Playgroud)

但另外,decltypeC++ 14中可以推断出没有规则的返回类型:

auto function()
{
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

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

C++ 11中的以下代码:

auto function() -> int
{
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

等于C++ 03中的以下代码:

int function()
{
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

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

C++ 11中的以下代码:

auto function(X x, Y y) -> decltype(x * y)
{
    return x; // Yeah! return x with the type of x * y expression!
}
Run Code Online (Sandbox Code Playgroud)

等于C++ 14中的以下代码:

decltype(auto) function(X x, Y y)
{
    return static_cast<decltype(x * y)>(x);
}
Run Code Online (Sandbox Code Playgroud)

如果以上代码错误且无法按预期工作,请纠正我.

EDIT,根据该意见(Yakk):他们是不是真的平等,第一个(C++ 11例)是隐式转换,而第二个(中static_castC++ 14例)是一种明确的转换.

结论

如您所见,我可以在不使用C++ 11 的替代函数语法功能的情况下完成所有操作.我对么?我可以完全忘记它而不会遇到任何技术问题吗?

通常,可以避免以下语法:

auto function() -> TYPE
{
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

支持以下语法:

TYPE function() // TYPE can be: auto, decltype(auto), or ...
{
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我是否忘记了使用C++ 11的函数返回类型推导功能无法实现的C++ 11 的尾随返回类型功能?

Ded*_*tor 15

使用自动返回类型推导的函数和具有显式返回类型的函数之间有三个重要的区别(即使计算它):

  1. 如果没有明确指定,则不能对返回类型的可计算性执行SFINAE:您会收到硬错误.为什么?因为SFINAE仅适用于声明,而不是函数的定义(SFINAE :(模板参数)替换失败不是错误).

    自动返回型扣除,无SFINAE
    SFINAE,但没有自动返回型扣除

    #include <iostream>
    int doit(int x, ...) { return x; }
    template<class X, class Y> auto doit(X x, Y y)
    #ifdef TRAILING_RETURN_TYPE
        -> decltype(doit(x) + doit(y))
    #endif
    { return doit(x) + doit(y); }
    int main() {
        std::cout << doit(1, nullptr) << std::endl;
    }
    
    Run Code Online (Sandbox Code Playgroud)
  2. 目前,如果定义使用自动返回类型推导,则不能使用其实际返回类型转发声明函数,也不能是虚拟的.(明确规则)

    7.1.6.4自动说明符 [dcl.spec.auto]

    13具有使用占位符类型的声明返回类型的函数或函数模板的重新声明或特化也应使用该占位符,而不是推导类型.
    14使用占位符类型的返回类型声明的函数不应是虚拟的(10.3).

  3. 只有具有自动返回类型推导的函数才能返回lambda,因为没有其他方法可以获取其类型.

    auto foo() { return [] {}; }
    
    Run Code Online (Sandbox Code Playgroud)

链接到该提案,该提案已纳入C++ 1y草案:http:
//www.open-std.org/jtc1/sc22/wg21/docs/papers/2013/n3638.html