在Clang中使用指向成员和地址空间的指针 我在一个有多个地址空间的目标上使用C++代码。我想使用的代码有指向成员的指针: struct foo { int bar; int baz; }; typedef int foo::*foo_member; foo_member m = &foo::bar; #define AS1 __attribute__((address_space(1))) int main() { foo AS1* f = /* ... */; f->*m = 4; }

在Clang中使用指向成员和地址空间的指针 我在一个有多个地址空间的目标上使用C++代码。我想使用的代码有指向成员的指针: struct foo { int bar; int baz; }; typedef int foo::*foo_member; foo_member m = &foo::bar; #define AS1 __attribute__((address_space(1))) int main() { foo AS1* f = /* ... */; f->*m = 4; },c++,clang,C++,Clang,到目前为止还不错。但是,当我尝试获取指向实际成员的指针时,事情变得很有趣: int main() { foo AS1* f = /* ... */; int AS1* x = &(f->*m); } Clang 3.7.0(标签/发行版/最终版)投诉: test.cpp:14:11: error: cannot initialize a variable of type '__attribute__((address_space(1))) int *'

到目前为止还不错。但是,当我尝试获取指向实际成员的指针时,事情变得很有趣:

int main()
{
    foo AS1* f = /* ... */;
    int AS1* x = &(f->*m);
}
Clang 3.7.0(标签/发行版/最终版)投诉:

test.cpp:14:11: error: cannot initialize a variable of type
      '__attribute__((address_space(1))) int *' with an rvalue of type 'int *'
        int AS1* x = &(f->*m);
                 ^   ~~~~~~~~
运算符的地址(或成员取消引用?)似乎会删除地址空间限定符


如何在确保不删除地址空间的同时使用指向具有地址空间的成员的指针?

这是一个编译器错误。它已被删除,并且已提交修补程序。

是否尝试将该属性放入指针类型<代码>使用foo_成员=int foo::*AS1,或使用foo_member=int AS1 foo::*?@KerrekSB,我也不清楚
AS1
限定符应该放在哪里,但要么错误保持不变,要么它抱怨您不能用
&foo::bar
初始化它。
和(f->bar)
是否起作用?也许它与指向成员的指针无关?@KerrekSB,是的,它在地址空间1中返回一个指针。在我看来,它像是一个编译器错误。