gpt4 book ai didi

c++ - 调用复制构造函数时会发生什么类型的初始化?

转载 作者:行者123 更新时间:2023-12-02 09:48:17 27 4
gpt4 key购买 nike

考虑下面的简单结构(默认是明确的)。

struct foo {
foo() = default;
foo(const foo&) = default;
};

foo bar() {
return foo{}; // return does copy init
}
下面进行哪种初始化?
foo a;        // default init
foo b{}; // value initialization
foo c{bar()}; // ?? mandatory copy elision. is this considered direct init? so copy init to return from
// bar(), then direct init to init c?
foo d{c}; // ?? copy constructor called. is this considered direct init or copy init?
foo e = d; // copy init
寻找C++ 17的答案。如果适用,请提供引用。
谢谢。

最佳答案

给定foo c{bar()};cbar()的返回值中的direct-list-initialized。与foo d{c};相同,d是从c直接列表初始化的。

  1. initialization of a named variable with a braced-init-list (that is, a possibly empty brace-enclosed list of expressions or nested braced-init-lists)

效果是,对于 foo c{bar()};,由于是 mandatory copy elision(从C++ 17开始),因此省略了 return语句中的副本构造和 c的初始化,因此 c由默认构造函数直接构造。对于 foo d{c};,选择了复制构造函数以构造 d
顺便说一句:在 bar()中, return foo{};执行 copy initialization,由于强制复制省略(自C++ 17起),省略了复制构造,因此返回值由默认构造函数直接初始化(自C++ 20起)。 (直到C++ 20,它将是 aggregate-initialized。)

关于c++ - 调用复制构造函数时会发生什么类型的初始化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62996308/

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