gpt4 book ai didi

c++ - 是否允许在默认成员初始值设定项中调用非静态成员函数?

转载 作者:行者123 更新时间:2023-12-01 14:40:15 25 4
gpt4 key购买 nike

考虑这个类:

#include <iostream>

struct foo {
int a = 42;
int b = bar();
int bar() { return a; }
};

int main(){
foo f;
std::cout << f.a << " " << f.b;
}

它打印预期的 42 42。标准是否允许在默认成员初始值设定项中调用成员函数?

以下我认为是未定义的:

struct broken {
int a = bar();
int b = 42;
int bar() { return b; }
};

不幸的是它确实如此 compile without warnings .

最佳答案

如您所见,这是合法的,但很脆弱,不推荐使用。当您为类成员指定默认初始化器时,这些只是在类成员初始化器列表中使用此值的语法糖。因此,如果我们查看何时可以调用成员函数,我们会发现 [class.cdtor]/1[class.cdtor]/4其中指出:

1) For an object with a non-trivial constructor, referring to any non-static member or base class of the object before the constructor begins execution results in undefined behavior. For an object with a non-trivial destructor, referring to any non-static member or base class of the object after the destructor finishes execution results in undefined behavior.

4) Member functions, including virtual functions ([class.virtual]), can be called during construction or destruction ([class.base.init]).[...]

强调我的

由于构造函数已经开始执行,并且我们可以调用成员函数,所以我们不在 UB 领域。

接下来我们要考虑的是构造顺序,因为成员依赖于它。该信息在 [class.base.init]/13

Then, non-static data members are initialized in the order they were declared in the class definition (again regardless of the order of the mem-initializers).

因此,成员是按照它们在类中声明的顺序构造的,这意味着在您的第一个示例中,您在初始化后引用了 a,因此您不在 UB 领域。

在您的第二个示例中,您指的是一个尚未初始化的对象,读取未初始化对象的值是未定义的行为。

关于c++ - 是否允许在默认成员初始值设定项中调用非静态成员函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58958637/

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