4

我正在使用SFINAE机制来推断类型。Resolve<T>::type推断为Tifclass T不包含yes并且推断为MyClassif 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 <----

根据以下逻辑应该是上述测试的结果:

  1. Resove<B1>::type = MyClass
  2. Resove<B2>::type = MyClass
  3. Resove<D1>::type = D1
  4. Resove<D2>::type = MyClass
  5. Resove<D3>::type = MyClass编译器错误(由于 B1、B2 之间的歧义)

奇怪的是,在测试用例 (5) 中并没有发生这种情况。结果是,

Resolve<D3>::type = D3;

谁能解释一下,多重继承特别发生了什么魔法?没有得到编译器错误是符合标准的行为吗?这是演示

4

1 回答 1

4

为什么会出现编译器错误?你知道SFINAE代表对Substitution Failure Is Not An Error吗?

当你被T表达式替换时D3就变得模棱两可了。由于 SFINAE,此失败不会被视为错误,并且您的专业化只会作为候选人被删除。这一切都是为了出现编译器错误。

于 2011-10-10T07:35:33.000 回答