gpt4 book ai didi

c++ - 构造函数 SFINAE 和继承在 clang 中失败

转载 作者:行者123 更新时间:2023-12-01 14:49:45 24 4
gpt4 key购买 nike

以下代码在 GCC 下编译良好,但在 clang 中失败并显示错误:

no matching constructor for initialization of 'Bar'



问题似乎是clang认为Foo的模板构造函数被Bar的模板构造函数隐藏或覆盖了。

这是 clang 中的错误还是 GCC 中的非标准化功能?

如何解决这个问题?我不能改变 Foo 因为它是第 3 方。

#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};
}

https://gcc.godbolt.org/z/etvpvF

最佳答案

叮当是对的。 [namespace.udecl]/14 :

(重点是我的)

When a using-declarator brings declarations from a base class into a derived class, member functions and member function templates in the derived class override and/or hide member functions and member function templates with the same name, parameter-type-list, cv-qualification, and ref-qualifier (if any) in a base class (rather than conflicting). Such hidden or overridden declarations are excluded from the set of declarations introduced by the using-declarator.



这意味着,对于这种情况,来自 foo 的继承构造函数模板被来自 Bar 的构造函数模板隐藏而无法查找.请注意,即使对于模板,也只考虑名称、参数类型列表、cv 限定和 ref 限定符处于隐藏状态。

关于c++ - 构造函数 SFINAE 和继承在 clang 中失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58705856/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com