首页 > 解决方案 > 在 Clang 中使用指向成员的指针的错误

问题描述

以下代码编译gcc成功

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() {
}

和铿锵编译失败

<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

这是无效的代码还是我听不懂铿锵声?

标签: c++clang++pointer-to-member

解决方案


从纯语言的角度来看,该代码是有效的。那是一个有效的变量模板,结果变量本身就是一个有效的类型(一个指向成员的指针)。事实上,即使没有显式实例化,Clang 也会抱怨。

并且为了说明问题,如果您将p<bool>表达式移到模板之外,Clang 对这个变量模板没有任何问题。这是 Clang 中的一个错误,导致它拒绝您的代码。


推荐阅读