继承专业化的模板参数推导

时间:2019-08-16 18:22:51

标签: c++ templates inheritance language-lawyer specialization

考虑this代码:

#include <type_traits>

template < typename > struct BB { };
template < >          struct BB<float> : BB<int> { };
                      struct DD : BB<float> { };

template < typename... Args >
void ff(BB<Args...>) { }

int main()
{
    ff(BB<float>{});
    ff(DD{}); // FAILS! 'BB<Args ...>' is an ambiguous base class of 'DD'
    return 0;
}

ff(DD{})的调用无法编译,因为gcc-8.3不想从BB<float>BB<int>中选择一个(clang一样) 。但是BB<float> isa BB<int>,为什么为什么BB<float>不能被挑选?!

问题是:这是否符合标准,并且在定义ffBB来帮助gcc-8.3选择BB<float>时有解决方法吗?

1 个答案:

答案 0 :(得分:10)

此问题是CWG 2303的主题。委员会决定添加措词“优先选择'较近的'基础班”,措词为added to the working draft。因此,在C ++ 20中,您的示例应该实例化ff<float>(BB<float>),而在C ++ 17中,它是模棱两可的。

当然,如果您的编译器不支持“ C ++ 2a”模式或C ++ 2a模式尚未实现此更改,则变通方法是添加ff重载D