0

来自 GetPerson 的未命名返回值不应该绑定到移动构造函数吗?

人.hpp

#ifndef PERSON_H
#define PERSON_H

#include <string>

struct Person {

    Person(std::string name, int age) : name(name), age(age) {
        std::cout << "ctor" << std::endl;
    }

    Person(const Person& rhs) : name(rhs.name), age(rhs.age) {
        std::cout << "copy ctor" <<  std::endl;
    }

    Person(Person&& rhs) : name(std::move(rhs.name)), age(std::move(rhs.age)) {
        std::cout << "move ctor" <<  std::endl;
    }

    ~Person() {
        std::cout << "dtor" << std::endl;
    }

    std::string name;
    int age;
};

#endif

主文件

#include <iostream>
#include "person.hpp"

Person GetPerson(std::string name, int age) {
    return Person(name, age);
}

int main(int argc, char* argv[]) {
    Person p(GetPerson("X", 21));
}

我正在使用 gcc 4.4.3 版(Ubuntu 4.4.3-4ubuntu5)并编译:

gcc -g -x c++ -lstdc++ -std=c++0x -o main ./main.cpp

是 RVO 还是 NRVO 的原因?

4

2 回答 2

2

RVO 启动并省略副本,并GetPerson("X", 21)p. 复制构造函数和移动构造函数都不需要调用。

如果你想在这里强制移动,那么std::move(GetPerson("X", 21))应该这样做,但我不确定你为什么要这样做。

于 2011-06-03T01:44:02.583 回答
1

是否调用移动构造函数并不重要。重要的是没有调用 COPY 构造函数。

如果您的代码依赖于此处调用的移动构造函数,则根据[class.copy]p31,它已损坏。

于 2011-06-02T02:41:47.230 回答