如果我们在定义中使用“decltype(auto)f()”作为带有“decltype(f())result”的函数声明会发生什么?

时间:2013-11-09 10:52:38

标签: c++ c++11 c++14

这实际上是一个C ++ 14问题。它更具理论性而非实际性。

有时你会以零碎的方式构建一个函数的结果:

int f( int x, int y )
{
    int  a;
    //...
    return a;
}

但是如果你改变了返回类型,你也必须改变“a”的类型。我通过特别声明来解决这个问题:

int f( int x, int y )
{
    decltype( f(x,y) )  a;
    //...
    return a;
}

(对于新手:如果函数参数使用r值引用会有什么陷阱?提示:我们需要std::forward来修复它。)一个问题随机突然出现在我脑海中:如果我使用了新的C ++ 14特性“decltype( auto )”作为返回类型?!我们会得到一个递归的黑洞吗?或者是一个不允许的错误?为“a”添加初始化程序会使所有内容都正常吗?

1 个答案:

答案 0 :(得分:2)

  

一个随机突然出现的问题:如果我使用新的C ++ 14怎么办?   “decltype(auto)”的特征作为返回类型?!

OP所指的例子是:

auto f( int x, int y ) // using C++1y's return type deduction
{
    decltype( f(x,y) )  a;
    //...
    return a;
}
  

我们会得到一个递归的黑洞吗?或者是一个不允许的错误?

不允许[dcl.spec.auto] / 11:

  

如果需要具有未减少占位符类型的实体的类型   为了确定表达式的类型,程序是不正确的。   但是,一旦在函数中看到了return语句,那么   从该语句推导出的返回类型可以在其余部分中使用   函数,包括在其他返回语句中。


  

a添加初始化程序会使一切正常吗?

实施例

decltype( f(x,y) )  a = 42;

没有;使用decltype需要确定f的返回类型。但是,以下是可能的:

auto a = 42;

来自评论:

  

所以我可以快速而肮脏if& return阻塞函数的开头,然后使用decltype(f(X))构造(对于函数的其余部分)?

是的,例如。

auto f( int x, int y ) // using C++1y's return type deduction
{
    if(false) return int();

    decltype( f(x,y) )  a;
    //...
    return a;
}

但是,我更喜欢:

auto f( int x, int y ) // using C++1y's return type deduction
{
    int a; // specifying the return type of `f` here
    //...
    return a;
}

auto f( int x, int y ) // using C++1y's return type deduction
{
    auto a = 42; // specifying the return type of `f` via the initializer
    //...
    return a;
}