在初始化期间将未初始化的字符串分配给自身 下面的程序真的有效吗C++? #include <string> int main () { std::string x = x; return 0; } #包括 int main(){ std::字符串x=x; 返回0; }

在初始化期间将未初始化的字符串分配给自身 下面的程序真的有效吗C++? #include <string> int main () { std::string x = x; return 0; } #包括 int main(){ std::字符串x=x; 返回0; },c++,initialization,C++,Initialization,它使用g++编译时不会出现错误或警告,运行时只会出现seg错误 如果我将x的类型更改为int,它至少会给我一个警告:警告:“x”在此函数中未初始化使用[-Wuninitialized] 我本以为该行是无效的,因为以前没有声明过x。这是未定义的行为。当您使用未初始化的对象初始化一个对象时。是的,它格式正确。变量名称的声明点位于声明符std::string x之后,而在初始化器=x之前,因此变量的名称可以在其自己的初始化器中使用 这允许定义良好的不使用该值的初始化,如: void * p = &am

它使用g++编译时不会出现错误或警告,运行时只会出现seg错误

如果我将x的类型更改为
int
,它至少会给我一个警告:
警告:“x”在此函数中未初始化使用[-Wuninitialized]


我本以为该行是无效的,因为以前没有声明过
x

这是未定义的行为。当您使用未初始化的对象初始化一个对象时。

是的,它格式正确。变量名称的声明点位于声明符
std::string x
之后,而在初始化器
=x
之前,因此变量的名称可以在其自己的初始化器中使用

这允许定义良好的不使用该值的初始化,如:

void * p = &p;

但不幸的是,它也允许未初始化的值在像您这样的示例中使用,并且具有未定义的行为。

与我在本文中的分析相关的也是相关的。。。这个问题可能是重复的。谢谢分享。我没有意识到这实际上是一个臭名昭著的例子。我意识到了。但我本来希望这是一个很容易被定义为无效C++的角落案例,导致编译器错误。为什么编译器会抱怨…它在语法上是正确的,但逻辑上是错误的。在一个更好的世界里,这条线将是语法错误的C++。编译器总是给语法正确的程序带来致命错误。char*a;int b=a;谢谢分享这个合理的例子。我仍然认为它是一个语言错误,原来的例子没有被标准禁止。