一个问题突然出现在我的脑海中:如果我使用“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
&块,然后使用该构造(对于函数的其余部分)?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;
}