这实际上是一个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”添加初始化程序会使所有内容都正常吗?
答案 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;
}