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

Vah*_*agn 9 c++ inheritance templates specialization language-lawyer

考虑以下代码:

#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;
}
Run Code Online (Sandbox Code Playgroud)

调用调用ff(DD{})无法编译,因为gcc-8.3不想从BB<float>和中选择一个BB<int>clang执行相同操作)。但是BB<float> isa BB<int>,为什么BB<float>不可以选择?

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

Bri*_*ian 10

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

当然,解决办法,如果你的编译器不支持“C ++ 2A”模式或者C ++ 2A模式还没有实现这一变化却是对的添加的过载ff是需要D