C++ 使用clang,派生类中的模板方法隐藏父对象';s具有相同名称的方法,即使SFINAE禁用了该方法,甚至使用了using声明

C++ 使用clang,派生类中的模板方法隐藏父对象';s具有相同名称的方法,即使SFINAE禁用了该方法,甚至使用了using声明,c++,clang++,sfinae,name-hiding,C++,Clang++,Sfinae,Name Hiding,请看一下这个小示例代码 #include <type_traits> struct base { template <typename T> int func(T); }; struct derived: base { using base::func; template <typename T, std::enable_if_t<std::is_same_v<T,const char*>>* = nul

请看一下这个小示例代码

#include <type_traits>

struct base {
    template <typename T>
    int func(T);
};

struct derived: base {
    using base::func;

    template <typename T, std::enable_if_t<std::is_same_v<T,const char*>>* = nullptr>
    int func(T);
};    

auto x = derived().func(1);
#包括
结构基{
模板
int-func(T);
};
派生结构:基{
使用base::func;
模板
int-func(T);
};    
自动x=派生().func(1);
它与gcc和icc配合得很好,与clang配合得不好,clang抱怨如下:

<source>:17:20: error: no matching member function for call to 'func'

auto x = derived().func(1);
         ~~~~~~~~~~^~~~

<source>:13:9: note: candidate template ignored: requirement 'std::is_same_v<int, const char *>' was not satisfied [with T = int]

    int func(T);
        ^
:17:20:错误:调用“func”时没有匹配的成员函数
自动x=派生().func(1);
~~~~~~~~~~^~~~
:13:9:注意:已忽略候选模板:未满足要求“std::is_same_v”[T=int]
int-func(T);
^
好像没有
使用声明
添加到
结构派生
。如果我不使用模板,我肯定知道这将是clang的问题。但是,我不确定我使用的是模板和SFINAE这一事实是否意味着需要使用不同的规则,因此我的问题是:哪个编译器是正确的?Clang,还是gcc和icc?


这里有一个关于godbolt问题的工作示例:

我正要向clang发布一个bug报告,然后我注意到大约2年前有人已经报告了这个问题。从那时起,它仍然处于新的状态,阅读相关的讨论(以及其中的链接),似乎没有关于这是否真的是一个bug的结论。这里有一个bug:我正要向clang发布一个bug报告,然后我注意到大约2年前有人已经报告了这个问题。从那时起,它仍然处于新的状态,阅读相关的讨论(以及其中的链接),似乎没有关于这是否真的是一个bug的结论。以下是错误: