C++ 从后面声明的另一个成员数据初始化一个成员数据是未定义的行为吗?
如果我的类声明了两个成员数据C++ 从后面声明的另一个成员数据初始化一个成员数据是未定义的行为吗?,c++,oop,C++,Oop,如果我的类声明了两个成员数据x和y,使得x从y初始化,并且y有一个值,那么isx有一个未定义的值?还是什么 class Empl { public: int x_{ y_ }; int y_{ 10 }; }; int main(){ Empl e{}; std::cout << e.x_ << ", " << e.y_ << std::endl; } class emp{ 公众: i
x
和y
,使得x
从y
初始化,并且y
有一个值,那么isx
有一个未定义的值
?还是什么
class Empl {
public:
int x_{ y_ };
int y_{ 10 };
};
int main(){
Empl e{};
std::cout << e.x_ << ", " << e.y_ << std::endl;
}
class emp{
公众:
int x{y};
int y{10};
};
int main(){
雇员{};
标准::cout
因此,这样做是否是未定义的行为
是的。读取不确定值的行为是未定义的。在本例中,y
的值用于初始化x
时具有不确定值,因为它是在x
之后初始化的。它是在x
之后初始化的,因为成员是按声明顺序初始化的。C++需要(或用于要求)x
先初始化,然后再y
初始化,因为这是它们声明的顺序。GCC可能正在优化它所认为的constepr。至于UB,这是可能的。编译并运行时使用-fsanitize=undefined
。它们是