Ошибка при использовании указателей на члены в Clang - PullRequest
2 голосов
/ 17 июня 2020

Следующий код компилирует g cc успешно

template<typename T>
class F {
public:
    template<typename V>
    static void foo(V T::*) {
        p<bool> = nullptr;
    }

    template<typename V>
    static inline V T::* p;
};

struct A;
template class F<A>;

int main() {
}

, а компиляция clang завершается неудачно с

<source>:10:18: error: member pointer refers into non-class type 'bool'

        static inline V T::* p;

                        ^

<source>:6:3: note: in instantiation of static data member 'F::p' requested here

                p<bool> = nullptr;

                ^

https://godbolt.org/z/NX7VmH

это недействительный код или я не понимаю лязг?

1 Ответ

4 голосов
/ 17 июня 2020

Код действителен с чисто языковой точки зрения. Это действительный шаблон переменной, а результирующая переменная сама имеет допустимый тип (указатель на член). На самом деле Clang жалуется даже на без явного создания .

И чтобы довести дело до конца, Clang не имеет проблем с этим шаблоном переменных, если вы переместите выражение p<bool> вне шаблона . Это ошибка в Clang, из-за которой он отклоняет ваш код.

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