构造函数SFINAE,继承失败,用clang

问题描述 投票:1回答:1

以下代码在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};
}

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

c++ gcc clang c++17 sfinae
1个回答
0
投票

由于某些原因,当添加第二个模板参数和默认参数时,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) {}
};

Live example

在此版本中,构造函数模板被很好地继承,并且可以像预期的那样用于重载解析。我会得出结论,这是一个Clang错误。

© www.soinside.com 2019 - 2024. All rights reserved.