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

main.cpp

#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コンストラクターが呼び出されないことです。

コードがここで呼び出されているmoveコンストラクターに依存している場合、[class.copy]p31ごとに壊れています。

于 2011-06-02T02:41:47.230 に答える