gpt4 book ai didi

c++ - 未构造对象的调用方法 : Legal?

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:33:31 28 4
gpt4 key购买 nike

如果为对象预留内存(例如,通过 union )但构造函数尚未被调用,调用对象的非静态方法之一是否合法,假设该方法不依赖于值任何成员变量?

我做了一些研究,发现了一些关于“变体成员”的信息,但找不到与此示例相关的信息。

class D {
public:
D() { printf("D constructor!\n"); }
int a = 123;
void print () const {
printf("Pointer: %p\n", &a);
};
};

class C {
public:
C() {};
union {
D memory;
};
};

int main() {
C c;
c.memory.print();
}

在这个例子中,我在没有调用构造函数的情况下调用 print()。目的是稍后调用构造函数,但即使在调用构造函数之前,我们也知道变量 a 的位置。显然 a 的值此时未初始化,但 print() 不关心该值。

这似乎在使用 gcc 和 clang 为 c++11 编译时按预期工作。但我想知道我是否在这里调用了一些非法或未定义的行为。

最佳答案

我相信这是未定义的行为。您的变体成员 C::memory 尚未初始化,因为 C 的构造函数未提供初始化器 [class.base.init]/9.2 .因此,c.memory 的生命周期尚未从您调用方法 print() 的那一刻开始 [basic.life]/1 .基于[basic.life]/7.2 :

Similarly, before the lifetime of an object has started but after the storage which the object will occupy has been allocated or, after the lifetime of an object has ended and before the storage which the object occupied is reused or released, any glvalue that refers to the original object may be used but only in limited ways. […] The program has undefined behavior if:

  • […]
  • the glvalue is used to call a non-static member function of the object, or
  • […]

强调我的

注意:我指的是 current C++ standard draft然而,上面的相关措辞与 C++11 基本相同,除了在 C++11 中,D 具有非平凡初始化这一事实至关重要,因为您正在做的事情可能否则在 C++11 中可能没问题……

关于c++ - 未构造对象的调用方法 : Legal?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55699626/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com