我可以将SFINAE用于表达式和decltype auto吗?
template<class T>
auto function() -> decltype(typename trait<T>::test(), auto) {
return [](){ return T(); };
}
答案 0 :(得分:2)
不,我认为你不能。
语法不允许:
decltype说明符:
decltype
(
表达)
decltype
(
auto
)
decltype(expr, auto)
不是有效的 decltype-specifier ,而decltype(auto)
是,它具有占位符类型的特殊含义。措辞非常具体:
使用
auto
或decltype(auto)
声明的变量的类型是从其初始化程序[...]auto
或decltype(auto)
中推导出来的,应显示为其中一个变量decl-specifier-seq和decl-specifier-seq中的说明符后面应跟一个或多个init-declarators,每个init-declarator都有一个非空的初始化器。
在C ++ 17中,概念Lite应该使SFINAE这样的黑客攻击不必要,所以我们不必永远依赖它们。您可以修改示例以将SFINAE约束放在默认模板参数中:
template<class T, class Requires = decltype(typename trait<T>::test())>
auto function() -> decltype(auto) {
return [](){ return T(); };
}
答案 1 :(得分:1)
您可以使用默认模板参数SFINAE和函数返回类型推导。
template<class T, class = decltype(typename trait<T>::test())>
auto function() {
return [](){ return T(); };
}
缺点是您没有可用的参数名称。