c++ - 返回类型推导是否可能?

标签 c++ c++11

考虑一个函数,不一定模板化:

T foo(Y bar);

其中 TY 是类型。

我可以使用decltype(bar) 来获取bar 的类型。所以我可以写这样的代码

decltype(bar) anotherBar;

但是有没有办法获取返回类型? decltype(return) 具有语法意义。

最佳答案

在 C++11 中,您可以使用尾随返回类型,例如:

auto foo(Y bar) -> decltype(some_expr(bar)) {
    return some_expr(bar);
}

需要让它尾随只是因为表达式依赖于声明为参数的 bar,并且在定义返回类型的地方不存在。

C++14 提供(或一旦批准)一种更简单的方法,编译器应在其中推断函数的类型:

auto foo(Y bar) {
    return some_expr(bar);
}

请注意,即使标准允许这样做,但声明中未明确说明类型这一事实可能会产生一些不良影响。对于初学者,您不能在不提供定义的情况下声明该函数(返回类型是根据主体推导出来的,没有主体,声明将没有返回类型)。此外,如果有多个返回语句,这是有问题的[我不记得这里的确切细节]

在模板函数的情况下,在模板参数被替换和函数实例化之前,返回表达式的类型是未知的,这是替换之后,因此推导的返回类型不能在 SFINAE 上下文中使用。

虽然 C++14 尚未获得批准,但某些编译器可能已经实现了此功能,请查看编译器的文档。

关于c++ - 返回类型推导是否可能?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23760057/

相关文章:

c++ - std::ofstream 是否保证打开新文件时将关闭旧的打开文件?

c++ - 不透明度不适用于 QWebEngineView 和半透明背景

c++在递归中通过引用传递

c++ - 使用 std::partition 对 vector 进行分区

c++ - 如何修复称为运行时错误的纯虚函数?

c++ - cout C++ 期间出现堆错误

c++ - 我是否需要知道算法的代码才能利用插入器和移动迭代器?

c++ - 在数字中的特定数字处查找数字

c++ - 在需要之前避免初始化成员

c++ - WinMain 重新定义