вызывающая функция, которая возвращает ссылку на значение - PullRequest
1 голос
/ 14 апреля 2020

Я думаю, что понимаю большинство вещей rvalue, но когда я попытался реализовать следующий код, я получил ошибку сегментации (ядро сброшено) :( возможно, мне все еще не хватает некоторых деталей, и я был бы признателен за любую помощь!

У меня есть struct Mode в заголовке:

#include <memory>
#include <iostream>

struct Mode
{
    explicit Mode(const int id_in, const int p_val=1) : id{id_in}, p{new int{p_val}} {
        std::cout << "explicit param default ctr called..." << std::endl;

    }
    Mode() : id{42}, p{nullptr}{
        std::cout << "default ctr called..." << std::endl;
    }

    Mode&& clone() {
        Mode m(*this);
        m.p.reset(new int{*m.p});
        return std::move(m);
    }   
    int id;
    std::shared_ptr<int> p;
};

и в основном. cpp Я делаю это:

int main()
{
    Mode m{42, 43};
    Mode m2;
    m2 = m.clone();

    cout << m.p << endl;
    cout << m2.p;
}

что происходит подробно в строке m2 = m.clone()? Что я понимаю до сих пор: в clone() он создает временную копию m, используя конструктор копирования Mode m(*this), и std :: перемещает содержимое этого временного объекта и, наконец, возвращает его вызывающей стороне m2. И в основном. cpp Я присваиваю rvalue для m2, используя назначение перемещения? Я не уверен до этого шага ...

1 Ответ

2 голосов
/ 14 апреля 2020

Ваш код имеет неопределенное поведение.

Вы привязываете локальную переменную m к возвращенной rvalue-reference; локальная переменная будет уничтожена при возврате функции, поэтому она всегда будет иметь привязанную ссылку.

и std::move содержимое этого временного объекта

Вы может быть недоразумение std::move; он просто преобразует аргумент в значение rvalue, но фактически не выполняет операцию перемещения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...