在 Clang 中使用指向成员的指针的错误
Mistake on using pointers-to-members in 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() {
}
并且 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;
^
这是无效代码还是我不明白 clang?
从纯语言的角度来看,该代码是有效的。这是一个有效的变量模板,结果变量本身就是一个有效的类型(指向成员的指针)。事实上,Clang 甚至抱怨 without the explicit instantiation.
为了说明问题,如果您移动 p<bool>
表达式 outside of the template,Clang 对这个变量模板没有任何问题。这是 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() {
}
并且 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;
^
这是无效代码还是我不明白 clang?
从纯语言的角度来看,该代码是有效的。这是一个有效的变量模板,结果变量本身就是一个有效的类型(指向成员的指针)。事实上,Clang 甚至抱怨 without the explicit instantiation.
为了说明问题,如果您移动 p<bool>
表达式 outside of the template,Clang 对这个变量模板没有任何问题。这是 Clang 中的一个错误,导致它拒绝您的代码。