类左值仅成员功能与shared_ptr

class lvalue only member fuction with shared_ptr

本文关键字:shared ptr 功能 成员      更新时间:2023-10-16

仅使用左值成员函数和shared_ptr

输出

test_object::test_object()
example::get_container() &
container::container() 
container::get() &
container::~container() 

我希望容器对象的 get(( 函数不会被 rvalue 调用。所以我添加了 & 关键字来获取((。

但是当我将其与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;
}

没有办法。通过 *-> 访问的指针的引用始终是左值。它被烘焙到语言中,标准库智能指针类型与此核心语言一致。

shared_ptr<container<type>>::operator->最终返回 container<type>* ,箭头运算符将应用于该运算符。箭头运算符等效于执行(*ptr).get()。因此,您将始终将get()应用于语言认为的左值。

这是一个不言而喻的价值。仅仅因为共享指针是临时指针,并不能改变它指向已占用存储

的事实,即左值。