gpt4 book ai didi

c++ - 与显式初始化相比,了解 C++ 中的复制初始化

转载 作者:可可西里 更新时间:2023-11-01 17:56:16 26 4
gpt4 key购买 nike

为什么第一个注释行编译正确,而第二个没有?

为什么a可以作为构造函数参数给自己,而b不能?
这两个不是在做同样的事情吗?

class Foo { Foo &operator =(Foo const &); /* Disable assignment */ };

int main()
{
Foo a = a; // OK
Foo b(b); // error C2065: 'b' : undeclared identifier
}

更新

由于它似乎是依赖于编译器的,因此问题似乎比我想象的要严重。
所以我想问题的另一部分是,以下代码是否有效?

它在 GCC 中给出了错误,但 Visual C++ 执行得很好。

int main()
{
int i = 0;
{ int *i(&i); }
return i;
}

最佳答案

在您的第一个代码中,两个声明都应该编译。海湾合作委员会就在那里。 Visual C++ 编译器有错误。

在第二个代码中,内部声明应该编译。 GCC也对,VC++错了。

GCC 在这两种情况下都是正确的

int a=a+100;int a(a+100); 这样的代码从语法的角度来看是好的.它们可能会调用未定义的行为,具体取决于它们是在静态存储期限 还是自动存储期限 中创建的。

int a = a + 100; //well-defined. a is initialized to 100
//a on RHS is statically initialized to 0
//then a on LHS is dynamically initialized to (0+100).
void f()
{
int b = b + 100; //undefined-behavior. b on RHS is uninitialized

int a = a + 50; //which `a` is on the RHS? previously declared one?
//No. `a` on RHS refers to the newly declared one.
//the part `int a` declares a variable, which hides
//any symbol with same name declared in outer scope,
//then `=a+50` is the initializer part.
//since a on RHS is uninitialized, it invokes UB
}

请阅读与上述每项声明相关的评论。

请注意,具有静态存储持续时间 的变量在编译时静态初始化为零,如果它们有初始化器,那么它们也会在运行时动态初始化。但是具有自动存储期限的 POD 类型的变量不会被静态初始化。

有关静态初始化与动态初始化的更多详细说明,请参阅:

关于c++ - 与显式初始化相比,了解 C++ 中的复制初始化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14640498/

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