我有以下代码snipet:
// 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:是否可以解释调用main函数第三行后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值“,为什么在这里?
答案 0 :(得分:0)
对于Q2 ,我只检查C ++文档,Queue.front()的返回值是引用,这意味着它返回一个l值
reference& front();
const_reference& front() const;
对于Q3,它适用于A_PTR temp_PTR = std::move(Q.front());
,这就是我想要的。