我正在使用SFINAE机制来推断类型。Resolve<T>::type
推断为T
ifclass T
不包含yes
并且推断为MyClass
if it contains yes
。
class MyClass {};
template<typename>
struct void_ { typedef void check; };
template<typename T, typename = void>
struct Resolve { typedef T type; };
template<typename T>
struct Resolve <T, typename void_<typename T::yes>::check> {
typedef MyClass type;
};
现在,我有简单的测试类,
struct B1 { typedef int yes; }; // 1
struct B2 { typedef int yes; }; // 2
struct D1 {}; // 3
struct D2 : B1 {}; // 4
struct D3 : B1, B2 {}; // 5 <----
根据以下逻辑应该是上述测试的结果:
Resove<B1>::type = MyClass
Resove<B2>::type = MyClass
Resove<D1>::type = D1
Resove<D2>::type = MyClass
Resove<D3>::type = MyClass
或编译器错误(由于 B1、B2 之间的歧义)
奇怪的是,在测试用例 (5) 中并没有发生这种情况。结果是,
Resolve<D3>::type = D3;
谁能解释一下,多重继承特别发生了什么魔法?没有得到编译器错误是符合标准的行为吗?这是演示。