c++ - move 语义和对象类型参数

标签 c++ c++11 move-semantics

我正在阅读 this回答关于 move 语义并提出问题。他描述了所谓的 move 和交换成语:

unique_ptr& operator=(unique_ptr source)   // note the missing reference
{
    std::swap(ptr, source.ptr);
    return *this;
}

因为 move 赋值运算符应该对右值 引用进行操作,所以我认为将右值引用作为参数传递是可以接受的。这是一个例子:

#include <iostream>

struct A {
    A(){ }
    virtual ~A(){ }
    A(A&&){ }
};

void foo(A a){
    std::cout << "foo(A)" << std::endl;
}

int main()
{
    foo(*new A);
}

DEMO

但是编译器警告我它试图复制引用的对象但失败了,因为复制构造函数被删除了。我不明白为什么它在带有 unique_ptr 的示例中是正确的。当我们调用该函数时,该对象应该被复制,因此没有意义的 move 语义。

你能解释一下吗?

最佳答案

表达式 *(new A) 不是右值。

关于哪些表达式是右值的一般规则(不是 the actual rule,只是速记)是这样的:它要么是临时的,要么是您显式调用 std::move 的东西。并且 *(new A) 不是临时的。而且您没有对其调用 move。所以它不是右值。

尝试使用 A() 代替。

关于c++ - move 语义和对象类型参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34326432/

相关文章:

c++ - 在 LabVIEW 中将复数传入和传出 DLL

c++ - 如何在子类和父类的 header 中指定构造函数

C++ 类模板类型 std::list

c++ - 返回非静态本地对象时,选择复制构造函数而不是 move 构造函数

c++ - 没有 std::erase 的 std::remove_if 的用例

c++ - 如何保留命令行选项但向 gcc 中的某些函数添加更多优化标志

c++ - 您建议在 Linux 中学习 C++ 编程的书籍或在线资源是什么?

c++ - 强制 C++ 更喜欢带有隐式转换的重载而不是模板

c++ - 自动生成的 move 构造函数导致非法行为

c++11 - 有没有办法使 move 的对象为 "invalid"?