考虑以下代码:
#include <iostream>
#include <type_traits>
template <typename T>
struct A {
int val = 0;
template <class = typename std::enable_if<T::value>::type>
A(int n) : val(n) {};
A(...) { }
/* ... */
};
struct YES { constexpr static bool value = true; };
struct NO { constexpr static bool value = false; };
int main() {
A<YES> y(10);
A<NO> n;
std::cout << "YES: " << y.val << std::endl
<< "NO: " << n.val << std::endl;
}
我想选择性地为使用 enable_if 的某些类型定义构造函数 A::A(int)。对于所有其他类型,默认构造函数 A::A(...) 应该是替换失败时编译器的默认情况。然而,这对我来说是有意义的编译器(gcc 版本 4.9.0 20130714)仍然在抱怨
sfinae.cpp:在“struct A”的实例化中:sfinae.cpp:19:11:从这里需要 sfinae.cpp:9:5:错误:在 “struct std::enable_if”
中没有名为“type”的类型 A(int n) : val(n) {};
对于构造函数来说,这样的事情可能吗?这是否可能与另一个构造函数(复制构造函数和移动构造函数)一起使用?