1

这确实是一个 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-value 引用会有什么陷阱?提示:我们需要std::forward修复它。)一个问题随机出现在我的脑海中:如果我使用新的 C++14 特性“ decltype( auto )" 作为返回类型?!我们会得到一个递归黑洞吗?还是不允许的错误?将初始化程序添加到“a”会使一切正常吗?

4

1 回答 1

2

一个问题突然出现在我的脑海中:如果我使用“decltype(auto)”的新 C++14 特性作为返回类型呢?!

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 语句,从该语句推导出的返回类型就可以在函数的其余部分中使用,包括在其他 return 语句中。


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

前任。

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

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

auto a = 42;

来自评论:

所以我可以在函数的开头有一个快速而肮脏的if&块,然后使用该构造(对于函数的其余部分)?returndecltype(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;
}
于 2013-11-11T14:28:02.207 回答