gpt4 book ai didi

c++11 - 为什么我不能使用大括号括起来的初始化列表来调用复制构造函数?

转载 作者:行者123 更新时间:2023-12-01 09:59:48 25 4
gpt4 key购买 nike

我试图运行 Bjarne Stroustrup 编写的新 C++ 编程语言书中的代码似乎不起作用。哪个编译器支持代码中的语法S y {x};?编译不了,我试过g++,vc++,还没有Clang,那个错误代码应该是初始化,之后,我把那个代码改成S y = x;赋值,但是没有输出结果作为评论,我哪里错了吗?

struct S {
     int* p;    // a pointer
};

S x {new int{0}};
void f()
{
     S y {x};              // "copy" x

     *y.p = 1;             // change y; affects x
     *x.p = 2;             // change x; affects y
     delete y.p;           // affects x and y
     y.p = new int{3};     // OK: change y; does not affect x
     *x.p = 4;             // oops: write to deallocated memory
}

然后我用C++03版本重写了代码,它按照描述工作,像这样:

struct S
{
int *p;
};

int main()
{
S x;
x.p = new int;
*(x.p) = 0;

S y = x;
*y.p = 1;
*x.p = 2;
delete y.p;
y.p = NULL;
x.p = NULL;
y.p = new int;
*(y.p) = 3;
*(x.p)= 4;
}

是不是有什么魔力,或者只是书上的代码不对。任何建议谢谢。

最佳答案

这是 C++11 措辞的一个已知问题。 C++14 CD 也没有修复此问题(请参阅 http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_active.html#1467 以获取相应的 DR)。

我们可以希望编译器在他们的 C++11 和 C++14 模式中追溯地实现 future 的修复。下一个问题列表修订版应包含解决此问题的问题 1467 的建议措辞。

关于c++11 - 为什么我不能使用大括号括起来的初始化列表来调用复制构造函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17938177/

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