考虑以下示例。当bar
被构造时,它为它的基类型 ( foo
) 构造函数提供了尚未初始化的数据成员my_member.y
的地址。my_member
struct foo {
foo(int * p_x) : x(p_x) {}
int * x;
};
struct member {
member(int p_y) : y(p_y) {}
int y;
};
struct bar : foo
{
bar() : foo(&my_member.y), my_member(42) {}
member my_member;
};
#include <iostream>
int main()
{
bar my_bar;
std::cout << *my_bar.x;
}
这定义好了吗?获取未初始化对象数据成员的地址是否合法?我发现了这个关于传递对未初始化对象的引用的问题,但它并不完全相同。在这种情况下,我在未初始化的对象上使用成员访问运算符。 .
确实,对象的数据成员的地址不应通过初始化来更改,但这并不一定会使该地址得到很好的定义。此外,会员访问运营商的 ccpreference.com 页面有这样的说法:
即使没有必要,也会计算两个运算符的第一个操作数(例如,当第二个操作数命名为静态成员时)。
我理解这意味着在&my_member.y
my_member
将被评估的情况下,我认为这很好(int x; x;
看起来很好),但我也找不到支持它的文档。