c++ - 复制 move 促销

标签 c++ move-semantics

我在 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/

相关文章:

c++ - 不必要清空移出的 std::string

c++ - 运算符中的完美转发[]

c++11 - std::vector.push_back(std::move(foo)) 有意义吗?

C++ 函数定义和变量声明不匹配?

c++ - 使用 MFC 编辑控件中的 block 字符(仅限 float 的示例)

c++ - 调用栈溢出时如何打印调用栈?

function - 为什么不能将变量移出闭包?

c++ - 使用 x64 汇编语言的通用 Windows 平台 C++

c++ - OpenGL - 二维纹理贴图

c++ - inline void addTask(Task task) vs inline void addTask(const Task &task)