在shared_ptr中仅使用左值成员函数
输出
test_object::test_object()
example::get_container() &
container::container()
container::get() &
container::~container()
我希望容器对象的get()函数不被右值调用。
所以我在get()中添加了&关键字。
但是当我将它与shared_ptr一起使用时,get()的这个make&关键字已过时。 那么,还有另一个好方法可以使它与shared_ptr一起使用吗?
我有一个使用静态成员函数的解决方案,它可以工作。 但是很脏。
class test_object
{
public:
test_object()
{
cout << "test_object::test_object()" << endl;
}
~test_object()
{
cout << "test_object::~test_object()" << endl;
}
};
template<typename type>
class container
{
public:
container(type* data) : pdata(data)
{
cout << "container::container() " << endl;
}
~container()
{
cout << "container::~container() " << endl;
}
type* get() &
{
cout << "container::get() &" << endl;
return pdata;
}
private:
type* pdata;
};
template<typename type = test_object>
class example
{
public:
shared_ptr<container<type>> get_container() &
{
cout << "example::get_container() &" << endl;
return make_shared<container<type>>(&data);
}
private:
type data;
};
int main()
{
example ex;
auto data = ex.get_container()->get();
//this should make compiler error,but
//it doesn't because get() is called by lvalue container object in rvalue
//shared_ptr. i want this code to make compiler error
getchar();
return 0;
}
答案 0 :(得分:0)
没有办法。通过*
或->
访问的指针的引用始终是左值。它已经融入了语言中,并且标准库的智能指针类型与此核心语言保持一致。
shared_ptr<container<type>>::operator->
最终返回container<type>*
,对其应用箭头运算符。箭头运算符等效于执行(*ptr).get()
。因此,您将始终将get()
应用于该语言认为的左值。
这是一个左值。仅仅因为共享指针是一个临时指针,并不会改变它指向一个左值的占用存储的事实。