以下代码在GCC下可正常编译,但在clang中失败,并显示错误:
没有匹配的构造函数,无法初始化'Bar'
问题似乎是铛认为Foo的模板构造函数被Bar的模板构造函数隐藏或覆盖。
这是Clang中的错误还是GCC中的非标准化功能?
如何解决此问题?因为它是第三方,所以我不能更改Foo。
#include <type_traits>
struct Foo {
Foo() = default;
template<typename T, std::enable_if_t<std::is_trivially_copyable_v<T>>* = nullptr>
Foo(T& object) {}
};
struct Bar : public Foo {
using Foo::Foo;
template<typename T, std::enable_if_t<!std::is_trivially_copyable_v<T>>* = nullptr>
Bar(T& object) {}
};
int main() {
int i;
Bar s{i};
}
由于某些原因,当添加第二个模板参数和默认参数时,Clang似乎不继承构造函数模板。另一方面,在函数的参数列表(C ++ 03样式)中使用SFINAE构造时没有问题:
struct Foo {
Foo() = default;
template<typename T>
Foo(T& object, std::enable_if_t<std::is_trivially_copyable_v<T>>* = nullptr) {}
};
struct Bar : public Foo {
using Foo::Foo;
template<typename T>
Bar(T& object, std::enable_if_t<!std::is_trivially_copyable_v<T>>* = nullptr) {}
};
在此版本中,构造函数模板被很好地继承,并且可以像预期的那样用于重载解析。我会得出结论,这是一个Clang错误。