gpt4 book ai didi

c++ - decltype(auto) 和 decltype(returning expr) 作为返回类型有什么区别?

转载 作者:IT老高 更新时间:2023-10-28 21:42:03 25 4
gpt4 key购买 nike

decltype(auto)decltype(returning expression) 作为函数(模板)的返回类型 if expr 有什么区别在这两种情况下都使用不带括号?

auto f() -> decltype(auto) { return expr; } // 1
auto f() -> decltype(expr) { return expr; } // 2

f 之上可以在任何上下文中定义/声明,可以是(成员)函数或(成员)函数模板,甚至是(通用)lambda。 expr 可以依赖于任何模板参数。

在第二个版本中,两个 expr 是完全相同的表达式,没有额外的括号。

在 C++14 及更高版本中使用第一种或第二种形式可以预期哪些差异?

如果到处都使用括号会怎样?

最佳答案

是的,有区别。第一个会根据函数体中的返回表达式检测返回类型。

第二个也不会将返回类型设置为 decltype() 内的表达式的类型,但也会对其应用 expression sfinae。这意味着如果 decltype 中的表达式无效,编译器将搜索另一个有效的重载。而第一个版本将是一个硬错误。

举个例子:

template<typename T>
auto fun(T a) -> decltype(a.f()) { return a.f(); }

template<typename T>
auto fun(T a) -> decltype(a.g()) { return a.g(); }

struct SomeType {
int g() { return 0; }
};

fun(SomeType{});

这会选择正确的重载。现在,如果我们将 decltype(expr) 替换为 decltype(auto),编译器将无法选择正确的重载,因为函数签名中没有 这限制了该类型应该能够做什么。

关于c++ - decltype(auto) 和 decltype(returning expr) 作为返回类型有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40429121/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com