c++ - 如果 std::move 用作 && 参数的参数,它是否会调用复制运算符?

标签 c++ c++11

这是我的代码:

#include <iostream>


class carl{
    public:
    int x;

    carl(int y):x(y){

    }


    carl(carl&& other)
    {
    std::cout<<" cons called?"<<std::endl;
    this->x = other.x;
    other.x = 0;
    }


    void operator=(carl&& other){
    std::cout<<"operator called?"<<std::endl;
    this->x = other.x;
    other.x = 0;
    }
};



void funct(carl&& get){
std::cout<<get.x<<std::endl;    
}


int main(int argc, char** argv) {
    carl c(2);
    funct(std::move(c));
    std::cout<<c.x<<std::endl;
    return 0;
}

输出:

2
2

如果我记得的话,有一条针对特殊成员函数的特殊规则规定,如果一个类声明了移动构造函数/运算符,那么该类将不会自动生成复制运算符/构造函数

从我的示例来看,移动运算符和构造函数似乎没有被调用,而是复制了值。它应该清空 c' x 的值并执行 cout 以确认,但没有发生。任何人都可以澄清我的代码发生了什么吗?

最佳答案

您的代码中没有发生任何移动。 func 将引用作为参数,因此传递 std::move(c) 只是绑定(bind)一个引用——不会发生复制或移动。关键事实是 std::move 不会移动,它只是返回一个指定对象的右值。如果您按值获取参数:

void func(carl get);

然后您将创建一个使用移动构造函数初始化的新对象(假设您将右值传递给 func)。

关于c++ - 如果 std::move 用作 && 参数的参数,它是否会调用复制运算符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31038910/

相关文章:

没有 .NET 的 C++ 注册表处理

c++ - 对于任何计数,for 循环运行一半

c++ - 同时修改 std::valarray<T> 的元素是否安全?

c++ - 使用atoi将字符数组转换为int给出了不同的值

c++ - strand 和 io 对象(如 tcp::socket)是否需要担心关联 io_service 的生命周期?

c++ - 为每个连接点集合传递一次所有连接点的算法

c++ - 避免指定包含模板函数指针的冗余模板参数

c++ - 如何在QTableView中绘制自定义控件?

c++ - gcc-4.9 未定义行为清理器

c++11 - 无法按值捕获随机引擎