确定函数内部函数的返回值类型



据我所知,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)

关键是,无论您考虑的情况有多复杂,一旦您能够编译程序,这意味着编译器就能够确定所需的所有类型。人类可能很难找到返回类型(老实说,还有许多其他模板(,但编译器则不然。或者,更好的是,编译器推导类型既不难也不容易:它要么推导(然后你可以运行程序(,要么不推导(在编译时失败(。

Enrico的答案展示了如何满足您的需求。

回答问题:

为什么像decltype(return(这样的功能还不存在?

要么是因为尚未提出此类功能,要么是因为该语言尚未接受此类建议。

最新更新