表达式和decltype(自动)的SFINAE

时间:2013-08-29 12:19:43

标签: sfinae c++14

我可以将SFINAE用于表达式和decltype auto吗?

template<class T>
auto function() -> decltype(typename trait<T>::test(), auto) {
  return [](){ return T(); };
}

2 个答案:

答案 0 :(得分:2)

不,我认为你不能。

语法不允许:

  

decltype说明符:
          decltype ( 表达 )
          decltype ( auto )

decltype(expr, auto)不是有效的 decltype-specifier ,而decltype(auto)是,它具有占位符类型的特殊含义。措辞非常具体:

  

使用autodecltype(auto)声明的变量的类型是从其初始化程序[...] autodecltype(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(); };
}

缺点是您没有可用的参数名称。