【问题标题】:Rationale for the shared_ptr atomic functions taking pointer instead of referenceshared_ptr 原子函数采用指针而不是引用的基本原理
【发布时间】:2018-07-22 18:06:48
【问题描述】:

如您所见hereshared_ptr 作为指针而不是引用传递。还要注意

如果 p 是空指针,所有这些函数都会调用未定义的行为。

那么为什么是指针呢?我认为在 C++ 中,除非有特定原因使用指针,否则应该首选引用。

【问题讨论】:

  • 不确定这是否有资格作为答案,但从您链接到的页面:这些函数通常使用互斥体实现,存储在全局哈希表中,其中指针值用作键..所以也许实现定义了接口。
  • 也许更清楚的是,它不会从调用方一侧本地增加引用计数。这是我能想到的唯一原因。
  • @NathanOliver 在我看来,这是一个应该对用户隐藏的实现细节。
  • 在 C11 中 <stdatomic.h> 包含一组名称完全相同的函数,以指针作为参数。如果 C++ 为这些函数定义了不同的接口,会不会很奇怪?

标签: c++ c++11 reference language-lawyer shared-ptr


【解决方案1】:
template< class T >
bool atomic_is_lock_free( const std::shared_ptr<T>* p );

采用指向智能指针的指针,因为这是更通用的atomic_is_lock_free 的特例:

template< class Atomic >
bool atomic_is_lock_free(const Atomic* obj)

其中Atomicstd::shared_ptr&lt;T&gt;。所有模板函数atomic_*也是如此。

正如用户 luk32 所注意到的,这只是部分回答了问题:“虽然 [...] 模板接口需要这样的签名,但它立即请求重新应用问题并询问为什么没有设计通用接口使用参考。”

嗯,那些 &lt;atomic&gt; 签名最初来自 GCC C 扩展 [需要引用] 函数 __sync_*。由于C 没有引用,C++ 委员会可能[需要引用] 愿意模仿这些函数并提供一种简单的方法来更新依赖于这些内置函数的代码。

【讨论】:

  • 我认为这并不能真正回答这个问题。虽然模板接口确实需要这样的签名,但它立即请求重新应用这个问题并询问为什么通用接口不是设计为使用引用。
  • 您的链接示例错误。这是因为您的using 声明在函数main 内,该函数将atomic_is_lock_free 隐藏在外面。将你的using 移到外面,编译正常。
  • @liliscent 确实如此,如果标准库在std:: 中定义了引用获取atomic_is_lock_free 也是如此。固定。
  • 这不是部分专业化。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-15
  • 1970-01-01
  • 2017-11-03
  • 2021-11-05
  • 2012-09-07
相关资源
最近更新 更多