据我所知,C++核心语言目前没有提供确定函数内部返回值类型的通用功能,例如:
auto f(std::uint8_t value)
{
double result {0.0};
// ...
auto&& tmp = static_cast<decltype(return)>(value);
// ...
return result;
}
为什么像decltype(return)
这样的功能还不存在?有理由希望将其添加到核心语言中吗?
您正在返回result
,因此auto
将推导出的类型(在编译时(就是result
的类型。
正如评论中所建议的,auto
推导出的类型通常与decltype(result)
推导出的不同,因为它们的行为不同:auto
使用模板类型推导,而decltype
则这样做。因此,它们可能在推导类型的参考性上有所不同,这可能非常重要。
然而,在您的示例中,由于result
是一个未加括号的id表达式,decltype(result)
将仅推导出double
,返回的auto
也将推导出相同的id表达式,因此这可能是可以的。你决定。
auto f(std::uint8_t value)
{
double result {0.0};
// lots of code ..
auto&& tmp = static_cast<decltype(result)>(value);
// lots of code ...
return result;
}
一旦程序被编译,f
的返回类型是result
的类型,这一点无论如何都不能改变,因此不需要语法支持decltype(return)
。
关键是,无论您考虑的情况有多复杂,一旦您能够编译程序,这意味着编译器就能够确定所需的所有类型。人类可能很难找到返回类型(老实说,还有许多其他模板(,但编译器则不然。或者,更好的是,编译器推导类型既不难也不容易:它要么推导(然后你可以运行程序(,要么不推导(在编译时失败(。
回答问题:
为什么像decltype(return(这样的功能还不存在?
要么是因为尚未提出此类功能,要么是因为该语言尚未接受此类建议。