我在 langdev.stackexchange.com 上问了类似的问题,但我认为它也适合这里。
C++ 编译器可以(或必须?)生成对 X 的 move 构造函数的调用,而不是以下示例中 return 语句中的复制构造函数:
struct X { /*...*/ };
X f(X x) { return x; }
现在考虑这段代码:
void f() {
X a;
X b = a; // Must call the copy constructor, not the move constructor
// More code that provably does not use or reference a
}
我想知道为什么 C++ 不允许像本例中那样更通用的复制 move 转换,如果它可以证明从对象复制的内容不再被使用。 我知道转换可能会改变代码的语义,但是前面示例中的转换也是如此,而且返回值优化通常也是如此。因此,标准似乎可以忽略复制构造函数,即使它们有副作用。
只是还没有人提出这个建议吗?或者这种转变是否存在不适用于 RVO 的陷阱?或者它只会让语言变得比现在更加复杂和困惑?
最佳答案
考虑您的示例可能会继续
struct X {
std::shared_ptr<int> p = std::make_shared<int>();
};
void f() {
X a;
int &i = *a.p;
X b = a;
{X c(std::move(b);}
++i;
}
i
只要 a
仍然有效,但通过这种隐式 move a
的值 会随着 c
一起消失。
关于c++ - 复制 move 促销,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/76599955/