C++为什么"observer_ptr<W>"有一个采用"W*"的构造函数?
C++ why does `observer_ptr<W>` have a constructor taking `W*`?
据我了解,提议的std::observer_ptr
与std::unique_ptr
有关的方式与std::weak_ptr
与std::shared_ptr
有关的方式相同。
那么,根据提案 N4282,为什么std::observer_ptr<W>
接口允许从W*
指针进行构造呢?
这意味着一个包含W*
作为成员的实现,可能类似于本答案中给出的伪实现,它最简单地提出了
template<typename T>
using observer_ptr = T*;
因此,这似乎排除了有效性检查,如下所示:
std::unique_ptr<W> u = std::make_unique<W>();
std::observer_ptr<W> o(uptr.get());
uptr.reset();
if(o)
{
//u is already nullptr, but o doesn't know
o->foo(); //invalid dereferentation
}
相反,我希望只被允许执行以下操作:
std::unique_ptr<W> u = std::make_unique<W>();
std::observer_ptr<W> o(uptr);
uptr.reset();
if(o)
{
//execution doesn't get here, o is nullptr
}
这相当于人们可以通过锁定std::weak_ptr
来使用它来执行的操作,并且是 imo observer_ptr
可以提供相对于非拥有原始指针的核心优势。
那么,再说一遍,为什么不强制执行呢?
据我了解,拟议的
std::observer_ptr
与std::unique_ptr
有关的方式与std::weak_ptr
与std::shared_ptr
有关的方式相同。
这是一种误解。它与unique_ptr
无关。它表示与被点头的所有权无关。
相关文章:
- 如果有一个模板构造函数只有一个泛型参数,为什么我必须有一个复制构造函数
- 关于复制构造函数的一个棘手问题
- C++构造函数,一个用于度,一个用于弧度
- 在成员初始值设定项列表和构造函数主体中委派构造函数有什么区别
- 关于QLIST类型实例复制构造函数的一个奇怪问题
- 删除默认类构造函数有什么意义?
- 如何应用使默认构造函数有条件地显式
- 两种类型的定义构造函数有什么区别?第一个使用":",第二个用大括号(如函数)定义它
- SquareMatrix 的 ADT 构造函数有什么问题?
- 需要使班级(long_number)用构造函数和一个打印功能代表1到60的任何长度
- 运算符 = 不匹配,构造函数创建一个指针
- 双重列表复制构造函数:与单一列表复制构造函数有何不同
- 为什么我不能在 c++ 类中声明一个空构造函数,该构造函数从一个具有私有构造函数的构造函数扩展而来
- 如何使构造函数接受一个非常量对象
- 初始值设定项列表,可变参数模板和构造函数推导:一个奇怪的情况
- shared_ptr的原始指针构造函数是一个错误吗?
- 通过初始化列表调用另一个类的构造函数.有问题
- 一个非平凡的复制构造函数有什么作用
- 有一个转换构造函数有什么意义?
- 按值传递给函数和按值传递给另一个构造函数时,调用构造函数有什么不同?