Как правильно передать право собственности на shared_ptr?

У меня есть следующий фрагмент кода:

// code snipet one:
#include <memory> 
#include <iostream> 
#include <queue>

struct A {
    uint32_t val0 = 0xff;

    ~A() {
        std::cout << "item gets freed" << std::endl;
    }
};

typedef std::shared_ptr<A> A_PTR;

int main() 
{ 
    std::queue<A_PTR> Q;
    Q.push(std::make_shared<A>());
    auto && temp_PTR = Q.front();
    std::cout << "first use count = " << temp_PTR.use_count() << std::endl;
    Q.pop();
    std::cout << "second use count = " << temp_PTR.use_count() <<std::endl;
    return 0;
}

После запуска я получил следующий результат:

first use count = 1                                                                                                                         
item gets freed 
second use count = 0

Q1: кто-нибудь может объяснить, как вызывается тип temp_PTR после третьей строки основной функции?

если я изменю эту строку как

A_PTR && temp_PTR = Q.front();

компилятор жалуется, что

main.cpp: In function 'int main()':
main.cpp:26:32: error: cannot bind '__gnu_cxx::__alloc_traits > >::value_type {aka std::shared_ptr}' lvalue to 'A_PTR&& {aka std::shared_ptr&&}'
     A_PTR && temp_PTR = Q.front();

Q2: я помню, что возвращаемое значение функции должно быть r-значением, но здесь компилятор говорит мне: "эй, возвращаемое значение Queue.front() является l-значением", почему здесь?

1 ответ

Для Q2 я просто проверяю документы на C++, что возвращаемое значение Queue.front() является referencenece, то есть оно возвращает l-значение

reference& front();
const_reference& front() const;

Для Q3 это работает для A_PTR temp_PTR = std::move(Q.front());Это то, что я хочу.

Другие вопросы по тегам