"The World's Dumbest Smart Pointer?"有什么意义
What's the point of "The World's Dumbest Smart Pointer?"
>提案N4282提倡一种新型的非拥有智能指针,称为observer_ptr
。它的工作名称是exempt_ptr
,它旨在替代"原始指针"。但我不明白它的目的,尤其是这个假设的代码,它旨在实现什么:
struct do_nothing
{
template <class T>
void operator ()(T*) { }; // do nothing
};
template <class T>
using non_owning_ptr = unique_ptr<T, do_nothing>;
即使看完这篇文章,我也不明白智能指针不做什么的目的。与非拥有shared_ptr
或原始指针相比,它有什么优势?
您是否阅读了您链接的提案 N4282 中的"动机"部分?
对于程序员来说,检查代码以识别任何特定裸指针的用途通常非常具有挑战性和耗时,即使该用途根本没有管理角色。正如Loïc A. Joly所观察到的那样,"要消除仅观察数据的T*指针的歧义并不容易......即使它只是用于文档,我认为拥有专用类型也会有一些价值。我们的经验使我们同意这一评估。
换句话说,它是为了使代码更加自我记录。
例如,如果我看到以下函数:
void do_something(Foo *foo);
那么我不知道do_something是否正在获得 foo 的所有权,想要一个长度不确定的 Foo 数组,只需要对它的可空引用,是否将其用作 Google C++ Style Guide 样式输出参数,或者只是想要引用的遗留 C 样式代码。
但是,如果我看到
void do_something(observer_ptr<Foo> foo);
然后我知道它正在观察一个 Foo 实例,仅此而已。
C++核心指南有几个使用模板的附加示例(owner
、not_null
等),不是为了添加运行时功能,而是为了更好的文档行为。
相关文章:
- 为不同配置设置MSVC_RUNTIME_LIBRARY的正确方法是什么
- 警告处理为错误这里有什么问题
- 什么时候调用组成单元对象的析构函数
- #定义c-预处理器常量..我做错了什么
- 努力将整数转换为链表。不知道我在这里做错了什么
- C++我的数学有什么问题,为什么我的代码不能正确循环
- "owned pointer"和 std::shared_ptr 的"stored pointer"有什么区别?
- 在 C++ 中,这两种"pointer delete"操作有什么区别?
- if(!pointer) 和 if(!*pointer) 有什么区别?
- 这是什么意思:"member reference type 'Human *' is a pointer; did you mean to use '->'?"
- C++ 中数组的"expression must have pointer-to-object type"是什么?
- "pointer was not declared in this scope"是什么意思
- 从void Pointer(创建通用存储)铸造有什么问题
- 当您声明"pointer type"形式(函数)参数"like an const array"时,什么是常量?
- "The World's Dumbest Smart Pointer?"有什么意义
- 除了语法,"call by reference"和"call by pointer"在内存方面C++有什么区别吗?
- 这个错误是什么意思" expression must have pointer-to-class type"?
- OpenGL gl*Pointer函数是做什么的
- "(void)pointer;" c++ 中是什么意思?
- C ++与"pointer = new type []"相比,"pointer = new type"是什么?