1

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

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

2 回答 2

2

不,我不认为你可以。

语法不允许:

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

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

使用autoor声明的变量的类型是从它的初始化程序decltype(auto)推导出来的- 声明符,每个声明符都应该有一个非空的初始化器。autodecltype(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(); };
}
于 2013-08-29T12:30:25.943 回答
1

不过,您可以将默认模板参数 SFINAE 与函数返回类型推导一起使用。

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

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

于 2013-08-29T12:39:10.947 回答