Почему конструктор перемещения не вызывается в этом надуманном примере? - PullRequest
0 голосов
/ 02 июня 2011

Не должно ли безымянное возвращаемое значение из GetPerson привязаться к конструктору перемещения?

person.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 причиной?

Ответы [ 2 ]

2 голосов
/ 03 июня 2011

RVO запускает и удаляет копию и создает GetPerson("X", 21) вместо p.Ни конструктор копирования, ни конструктор перемещения не должны быть вызваны.

Если вы хотите форсировать перемещение здесь, то std::move(GetPerson("X", 21)) должно сработать, но я не уверен, почему вы захотите.

1 голос
/ 02 июня 2011

Независимо от того, вызывается или нет конструктор перемещения.Что важно, так это то, что конструктор COPY НЕ вызывается.

Если ваш код основан на вызываемом здесь конструкторе перемещения, он не работает, согласно [class.copy] p31.

...