在 C++11 或 14 中没有尾随返回类型的 auto 返回函数的返回类型推导就像你做的那样完成
auto retval = /* return expression */
而auto总是推导出一个值类型。
Lambda 是 C++11 中唯一的 auto 返回函数。在 C++14 中,它被扩展到其他函数(遵循类似的规则)。
在 C++11 中,您可以使用 lambda 上的 ->decltype(var) 或 ->int const& 尾随返回类型来解决此问题。
在 C++14 中你可以简单地->decltype(auto),它改变了返回类型推导规则
auto retval = /* return expression */
更像
decltype(/* return expression */) retval = /* return expression */
在您的情况下,这意味着不要删除 & 或 const。
请注意,返回const& 参数是非常危险的,因为右值可以隐式转换为const&,并且引用生命周期扩展不会通过函数调用。所以:
auto&& x = some_function();
// or
int const& x = some_function();
即使some_function() 返回一个临时值也是安全的,同时假设f 的行为方式与您希望f 的行为方式相同:
auto&& x = f( some_function() );
// or
int const& x = f( some_function() );
生成x 对some_function() 返回的临时值的悬空引用。
这可能会出人意料地破坏事情,例如 for(:) 循环在后台隐式使用 auto&& 参数,并清理范围表达式初始化和迭代执行之间的临时性。
这个答案还不完整,因为我没有在标准中添加参考。