gpt4 book ai didi

c++11 - 为什么这个副本不能自动换招?

转载 作者:行者123 更新时间:2023-12-02 04:44:21 25 4
gpt4 key购买 nike

测试类:

#include <iostream>
#include <string>

struct inner
{
std::string value;

inner() : value("test") {
std::cerr << "inner default construct\n";
}
inner(inner &&mv) : value(std::move(mv.value)) {
std::cerr << "inner move construct\n";
}
inner(inner const &copy) : value(copy.value) {
std::cerr << "inner copy construct\n";
}
};

struct outer
{
inner value;
outer() {}
outer(inner v)
: value(v)
{}
};

move 语义的简单测试符合我的预期:

inner mover(inner x)
{
return x;
}
int main()
{
inner i;
auto q = mover(std::move(i));
return 0;
}

...输出:

inner default construct

inner move construct

inner move construct

但是这个 main 做了一些我没想到的事情:

int main()
{
inner i;
outer o(std::move(i));
return 0;
}

inner default construct

inner move construct

inner copy construct

我原以为副本会是另一步,就像在第一个主线中一样。为什么使用 move 的优化在第一种情况下可用,而在第二种情况下不可用?

我意识到我可以在 outer(inner v) 构造函数中显式调用 std::move ....但为什么需要这样做?为什么编译器不能执行隐式 move ?

最佳答案

你需要在初始化列表中说: value(std::move(v))

关于c++11 - 为什么这个副本不能自动换招?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20110278/

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