0
#include <iostream>

class A {
public:
    A() { std::cout << "Constructor" << std::endl; }
    A(const A& a) { std::cout << "Copy Constructor" << std::endl; }
    A& operator=(const A& a) { std::cout << "Copy = operator" << std::endl; }
    A(A&& a) { std::cout << "Move Constructor" << std::endl; }
    A& operator=(A&& a) { std::cout << "Move = operator" << std::endl; }
    ~A() { std::cout << "Destructor" << std::endl; }
};

void f(A&& a) { std::cout << "function" << std::endl; }

int main() {
    f(A());
    return 0;
}

以下程序的输出是:

Constructor
function
Destructor

为什么这里没有调用移动构造函数?即使我使用标志 -fno-elide-constructors 编译,似乎也会发生复制省略:g++ test.cpp -fno-elide-constructors -std=c++11

4

1 回答 1

6

简短的回答:你不是在移动构建任何东西

您只是在创建一个临时A对象,然后传递对它的引用。如果您想查看移动构造,例如可以将签名更改f

void f(A a)
于 2016-11-25T08:56:07.353 回答