Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/139.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++:为什么弱\u ptr没有共享的\u ptr&构造函数? C++草案标准:以下的弱构造函数:_C++_C++ Standard Library - Fatal编程技术网

C++:为什么弱\u ptr没有共享的\u ptr&构造函数? C++草案标准:以下的弱构造函数:

C++:为什么弱\u ptr没有共享的\u ptr&构造函数? C++草案标准:以下的弱构造函数:,c++,c++-standard-library,C++,C++ Standard Library,我很惊讶没有看到以下构造函数: template<class Y> weak_ptr(shared_ptr<Y>&& r) noexcept; 当然,从const reference到shared_ptr的现有构造函数在右值引用版本可以工作的任何上下文中都可以工作。但是我相信,如果调用者希望通过使用共享值来初始化弱引用,从而破坏性地将共享引用转换为弱引用,则后者将允许保存至少两个原子操作。弱引用持有指向共享ptr管理的对象的非所有权指针。删除对该对象的最

我很惊讶没有看到以下构造函数:

template<class Y> weak_ptr(shared_ptr<Y>&& r) noexcept;
当然,从const reference到shared_ptr的现有构造函数在右值引用版本可以工作的任何上下文中都可以工作。但是我相信,如果调用者希望通过使用共享值来初始化弱引用,从而破坏性地将共享引用转换为弱引用,则后者将允许保存至少两个原子操作。

弱引用持有指向共享ptr管理的对象的非所有权指针。删除对该对象的最后一个共享\u ptr引用时,该对象将被删除

如果缺少的构造函数将存在,则可能会将最后一个现有的shared_ptr作为参数传递,这将在移动过程中破坏对象。因此,将留下一个指向已删除对象的弱\u ptr

没有多大意义,对吧?

弱\u ptr持有指向共享\u ptr管理的对象的非所有权指针。删除对该对象的最后一个共享\u ptr引用时,该对象将被删除

如果缺少的构造函数将存在,则可能会将最后一个现有的shared_ptr作为参数传递,这将在移动过程中破坏对象。因此,将留下一个指向已删除对象的弱\u ptr


没有什么意义,对吧?

弱者应该知道共享的存在吗?你会保存什么?当前弱\u ptr构造函数只需要递增弱计数器,之后,当共享\u ptr被销毁时,递减共享计数器并可能销毁指向的对象。使用建议的move构造函数,它需要增加弱计数器,减少共享计数器,并可能破坏指向的对象。相同的操作,刚刚执行过。@BradAllred是的。它应该知道它的存在——弱ptr已经有构造函数使用它了,并且可以转换为弱ptr以及共享控制块结构。@Revolver\u Ocelot:事实上,至少在我的libstdc++副本中你是对的;我误解了共享计数的结构。如果你把它作为一个答案提交给我,我很高兴标记它被接受。弱者应该知道关于共享的存在吗?你会保存什么?当前弱\u ptr构造函数只需要递增弱计数器,之后,当共享\u ptr被销毁时,递减共享计数器并可能销毁指向的对象。使用建议的move构造函数,它需要增加弱计数器,减少共享计数器,并可能破坏指向的对象。相同的操作,刚刚执行过。@BradAllred是的。它应该知道它的存在——弱ptr已经有构造函数使用它了,并且可以转换为弱ptr以及共享控制块结构。@Revolver\u Ocelot:事实上,至少在我的libstdc++副本中你是对的;我误解了共享计数的结构。如果你把它作为一个答案提交,我很高兴标记它被接受。我不认为这是答案。显然,语义将是以一个空的弱指针结束,就像用一个临时共享的\u ptr调用现有的const引用构造函数一样,例如,一个立即被销毁的函数的返回值。毕竟,在最后一个引用被删除后变为空是整个弱点。@jacobsa在这种情况下,你当然是对的,但无论如何没有人这样做,对吗?。但是使用新的构造函数,您总是会得到一个空的弱指针,除非之前至少有第二个共享的\u ptr引用。我看不到这种行为的使用案例。@jacobsa我看不到这样做是最优雅的解决方案的任何可能用途。我认为这不是答案。显然,语义将是以一个空的弱指针结束,就像用一个临时共享的\u ptr调用现有的const引用构造函数一样,例如,一个立即被销毁的函数的返回值。毕竟,在最后一个引用被删除后变为空是整个弱点。@jacobsa在这种情况下,你当然是对的,但无论如何没有人这样做,对吗?。但是使用新的构造函数,您总是会得到一个空的弱指针,除非之前至少有第二个共享的\u ptr引用。我看不到这种行为的用例。@jacobsa我看不到这样做是最优雅的解决方案的任何可能用途。
template<class Y> weak_ptr(shared_ptr<Y>&& r) noexcept;