【发布时间】:2018-04-25 18:22:06
【问题描述】:
考虑以下示例。当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;
}
这是明确定义的吗?获取未初始化对象数据成员的地址是否合法?我发现this question 关于将引用传递给未初始化的对象,但这并不完全相同。在这种情况下,我在一个未初始化的对象上使用了member access operator.。
确实,对象的数据成员的地址不应该通过初始化来改变,但这并不一定会使获取该地址得到很好的定义。此外,member access operators 上的 ccpreference.com 页面有这样的说法:
两个运算符的第一个操作数即使没有必要也会被计算(例如,当第二个操作数命名为静态成员时)。
我理解这意味着在&my_member.y 的情况下my_member 将被评估,我认为这很好(就像int x; x; 似乎很好)但我也找不到支持它的文档。
【问题讨论】:
-
这绝对是很好的定义。并且算子的内置地址不访问成员存储。给定的引用仅指
.和->运算符。 -
@VTT 然后我想我要问的是在
&my_member.y中使用.是否定义明确。 -
哦,所以我猜
&my_member.y的问题实际上不是运算符的地址,而是评估仍未初始化的对象的成员访问运算符。我应该更仔细地阅读问题。
标签: c++ language-lawyer object-lifetime ctor-initializer member-access