【问题标题】:Getting the raw pointer from a smart pointer从智能指针获取原始指针
【发布时间】:2016-08-01 12:55:27
【问题描述】:

抱歉,如果这是重复的.. 希望不是。我搜索了一长串问题,但似乎都没有真正解释清楚。

这里是:在下面

int main(int,char**){
    auto a = make_unique<std::string>("Hello World");

    // do stuff with either &*a or a.get()

    return 0;
}

&amp;*aa.get() 之间有什么区别吗?我知道它们都返回原始指针值(除非operator&amp; 被重载),但是选择一个比另一个有运行时优势吗?

【问题讨论】:

  • 如果原始指针为 nullptr,&amp;*a 是未定义的行为。
  • 如果anullptr&amp;*a 不会简单地为 0?
  • 首选get,这就是它的用途,更清楚地传达意图,并且更易于阅读

标签: c++ pointers c++11 c++14 smart-pointers


【解决方案1】:

&amp;*a 如果指针为 nullptr,则为未定义行为。您可以了解更多关于未定义行为here

在所有其他情况下,我希望两种解决方案都相当。我更喜欢使用get(),因为这是每个人都能理解的直接方式。

来自 C++ 标准:

20.9.1.2.4 unique_ptr 观察者 [unique.ptr.single.observers]

typename add_lvalue_reference::type operator*() const;
1 要求:get() != nullptr.
2 返回:*get()。

【讨论】:

  • +1 用于标准参考 :) 我尝试每个编译一次.. g++ -o test test.cpp.. 二进制文件不同,所以不太一样,我猜。不知道如何判断哪个更快..
  • @born2smile 使用优化器 (-O) 并进行比较
  • 啊,确实。使用优化器,两者编译成相同的代码。我想知道如果anullptr 会有什么后果
  • @Born2Smile :未定义行为的行为未定义。 ;-]
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-25
  • 1970-01-01
  • 1970-01-01
  • 2022-01-23
  • 1970-01-01
相关资源
最近更新 更多