С помощью clang шаблоны методов в производном классе скрывают методы родителя с тем же именем, даже если они отключены SFINAE и даже с использованием-объявления - PullRequest
1 голос
/ 22 апреля 2020

Пожалуйста, посмотрите на этот небольшой пример кода

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

Он прекрасно компилируется с g cc и i cc, не с 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);
        ^

Как будто using-declaration не было добавлено к struct derived. Если бы я не использовал шаблоны, я бы точно знал, что это было бы проблемой clang. Однако я не уверен в том, что я использую шаблоны, а SFINAE предполагает использование других правил, поэтому вот мой вопрос: какой компилятор прав? Clang, или g cc и i cc?

Вот рабочий пример проблемы с Godbolt: https://godbolt.org/z/xv98SP

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...