有什么区别decltype(auto)
and decltype(returning expression)
作为函数(模板)的返回类型如果expr
在这两种情况下都没有使用括号吗?
auto f() -> decltype(auto) { return expr; } // 1
auto f() -> decltype(expr) { return expr; } // 2
Above f
可以在任何上下文中定义/声明,并且可以是(成员)函数或(成员)函数模板,甚至可以是(通用)lambda。expr
可以依赖于任何模板参数。
在第二个版本中expr
是完全相同的表达式,没有额外的括号。
在 C++14 及更高版本中使用第一种或第二种形式可以预期哪些差异?
如果到处都使用括号怎么办?
是,有一点不同。第一个将根据函数体中的返回表达式检测返回类型。
第二个也不会将返回类型设置为内部表达式的类型decltype()
,但也将适用表达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)
by decltype(auto)
,编译器将无法选择正确的重载,因为没有任何东西在函数签名中这限制了该类型应该能够执行的操作。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)