C++ 类仅左值的成员函数,具有共享\u ptr

C++ 类仅左值的成员函数,具有共享\u ptr,c++,C++,将仅左值成员函数与共享的\u ptr一起使用 输出 test_object::test_object() example::get_container() & container::container() container::get() & container::~container() 我希望容器对象的get()函数不被右值调用。 所以我在get()中添加了&关键字 但是当我将它与shared_ptr一起使用时,get()的make&关键字就过时了。 那么,有没有另一个

将仅左值成员函数与共享的\u ptr一起使用

输出

test_object::test_object()
example::get_container() &
container::container() 
container::get() &
container::~container() 
我希望容器对象的get()函数不被右值调用。 所以我在get()中添加了&关键字

但是当我将它与shared_ptr一起使用时,get()的make&关键字就过时了。 那么,有没有另一个好方法可以让共享的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;
}
类测试对象
{
公众:
测试对象()
{

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

shared\u ptr::operator->
最终返回
container*
,箭头操作符应用于该容器。箭头操作符相当于执行
(*ptr).get()
。因此,您将始终将
get()
应用于语言认为是左值的对象


而且它是一个左值。仅仅因为共享指针是一个临时的,并不能改变它指向已占用存储的左值的事实。

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

shared\u ptr::operator->
最终返回
container*
,箭头操作符应用于该容器。箭头操作符相当于执行
(*ptr).get()
。因此,您将始终将
get()
应用于语言认为是左值的对象


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

谢谢你,先生。然后我必须创建一个静态函数,它将共享的左值作为参数。@Hunter-我承认我不太明白你在这里想要实现什么。我怀疑你你可能会问你的设计,而不是问题本身(可能会有更好的设计)。您可以随时输入。我正在制作一种缓冲区同步系统。我想使用shared_ptr的原因是我想在从函数返回时自动解锁缓冲区。@Hunter-如果您想询问实现方法,请问另一个问题(即,发布另一个SO问题)。评论不是讨论这个问题的正确方式。在准备过程中,请确保不要意外地问一个问题。如果你问了一个好问题,你可能会惊讶于这个社区能想出什么。谢谢你,先生。然后我必须做一个静态函数,该函数将shared_ptr的左值作为参数。@Hunter-我承认我没有提问我想你可能问的是你的设计,而不是问题本身(可能有更好的设计)。您可以随时输入。我正在制作一种缓冲区同步系统。我想使用shared_ptr的原因是我想在从函数返回时自动解锁缓冲区。@Hunter-如果您想询问实现方法,请问另一个问题(即,发布另一个SO问题)。评论不是讨论此问题的正确方式。在准备时,请确保不要意外地提出问题。如果您提出了一个好问题,您可能会惊讶于此社区能提出什么。