gpt4 book ai didi

c++ - 可以在 c++17 的聚合初始化中执行复制省略吗?

转载 作者:行者123 更新时间:2023-11-27 22:42:15 25 4
gpt4 key购买 nike

给定:

//C++17
#include <string>
struct Foo {
int i;
std::string str;
};

int main() {
Foo foo{1, std::string("Hello, world!")};
}

Foo::iFoo::str 可以直接从1std::string(.. .) 而不是复制到它们中,并解释为什么不能/不能使用 C++17 标准(可能是一些用于测试目的的代码)?

如果不能,需要多少份?

最佳答案

聚合初始化基本上执行逐元素复制初始化。所以这个:

struct Foo {
int i;
std::string str;
};

Foo foo{1, std::string("Hello, world!")};

做同样的初始化:

int i = 1;
std::string str = std::string("Hello, world!");

我们有a new rule在 C++17 中说:

If the initializer expression is a prvalue and the cv-unqualified version of the source type is the same class as the class of the destination, the initializer expression is used to initialize the destination object. [ Example: T x = T(T(T())); calls the T default constructor to initialize x. — end example ]

这意味着第二次初始化的行为必须像您编写的那样:

std::string str("Hello, world!");

即零拷贝。


以下示例很好地演示了新规则:

struct X {
X(int ) { }
X(X&& ) = delete;
};

struct Y {
X x;
};

int main() {
Y y{X{4}}; // ill-formed in C++14 due to deleted move ctor
// ok in C++17, no move required
}

关于c++ - 可以在 c++17 的聚合初始化中执行复制省略吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47853659/

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