我在编写的程序中遇到了一些莫名其妙的 SFINAE 问题,因此我将其归结为一个独立的示例程序:
#include <type_traits>
struct Base { };
struct Derived : public Base { };
template<typename T>
struct From { };
template<typename T>
struct To {
template<typename U>
To(const From<U>& other) {
static_assert(std::is_convertible<U*, T*>::value, "error");
}
};
int main() {
From<Derived> a;
To<Base> b = a;
}
该程序编译时没有错误或警告。然而,这:
#include <type_traits>
struct Base { };
struct Derived : public Base { };
template<typename T>
struct From { };
template<typename T>
struct To {
template<typename U>
To(const From<typename std::enable_if<true, U>::type>& other) {
// this ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
static_assert(std::is_convertible<U*, T*>::value, "error");
}
};
int main() {
From<Derived> a;
To<Base> b = a;
}
给出以下错误:
test.cpp:在函数中
int main()
:test.cpp:22:18:错误:请求从
From<Base>
非标量类型转换To<Derived>
这是因为我认为替换失败了,并且没有看到构造函数。
我做错了 SFINAE,还是这是一个编译器错误?我在 Windows 上使用 rubenvb 的 GCC 4.7.1(std=c++11
如果它有所作为)。