此嵌套模板基类是否不明确?

Is this nested template base class ambiguous?

本文关键字:是否 不明确 基类 嵌套      更新时间:2023-10-16

这段代码曾经在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
}

叮当 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类继承自从impl<A>继承的impl<B, A>

所以B继承了一对不同的impl<D, I...>基类,所以类型推导是模棱两可的(D == BI... == <A>D == AI... == <>)。

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

我的最终目标是检测 impl 参数包中的类型,这些类型本身就是 impl 的实例。我这样做的方式是错误的吗?

是的,你这样做的方式是错误的(我认为)。