我可以将 SFINAE 用于表达式和 decltype auto 混合吗?
template<class T>
auto function() -> decltype(typename trait<T>::test(), auto) {
return [](){ return T(); };
}
不,我不认为你可以。
语法不允许:
decltype 说明符:
decltype
(
表达式)
decltype
(
auto
)
decltype(expr, auto)
is 不是有效的decltype-specifier,而decltype(auto)
is 并且它作为占位符类型具有特殊含义。措辞非常具体:
使用
auto
or声明的变量的类型是从它的初始化程序decltype(auto)
推导出来的- 声明符,每个声明符都应该有一个非空的初始化器。auto
decltype(auto)
在 C++17 Concepts Lite 中,无论如何都应该使此类 SFINAE hack 变得不必要,因此我们不必永远依赖它们。您可以修改示例以将 SFINAE 约束放在默认模板参数中:
template<class T, class Requires = decltype(typename trait<T>::test())>
auto function() -> decltype(auto) {
return [](){ return T(); };
}
不过,您可以将默认模板参数 SFINAE 与函数返回类型推导一起使用。
template<class T, class = decltype(typename trait<T>::test())>
auto function() {
return [](){ return T(); };
}
缺点是您没有可用的参数名称。