这个嵌套模板 base class 有歧义吗?

Is this nested template base class ambiguous?

此代码用于在 Clang 3.8 中编译,并且仍在 VS 2017 中编译,但在 Clang 3.9 中开始发出错误。

template <typename D, typename ... I>
struct impl : I ...
{};

template <typename D, typename ... I>
void f(impl<D, I...> const&)
{}

struct A : impl<A> {};
struct B : impl<B, A> {};

int main()
{
    f(A());
    f(B()); // Error
}

Clang 3.9 说

<source>:15:5: error: no matching function for call to 'f'
    f(B());
    ^
<source>:6:6: note: candidate template ignored: failed template argument deduction
void f(impl<D, I...> const&)
     ^

所有三个编译器都在运行: https://godbolt.org/g/OKFpPl

我希望 f(A()) 推导 D = A, I... = <>f(B()) 推导 D = B, I... = A,然后可以将其推导为 impl 的一个实例。我的最终目标是检测 impl 的参数包中的类型,它们本身就是 impl 的实例。我是不是用错了方法?

不确定但是...

您的 B class 继承自 impl<B, A> 继承自 impl<A>.

所以 B 从几个不同的 impl<D, I...> 基础 class 继承,所以类型推导是不明确的(D == BI... == <A>D == AI... == <>).

所以我认为 clang 3.8 是错误的,而 3.9 是正确的。

My end goal is to detect type in impl's parameter pack that are themselves instances of impl. Am I going about this the wrong way?

是的,你做错了(我认为)。