从智能指针获取原始指针

4

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

以下是内容:

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

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

    return 0;
}

&*aa.get()有区别吗?我知道它们都返回原始指针值(除非重载了operator&),但是在运行时选择其中一个是否有优势?


4
如果原始指针为 nullptr,则“&*a” 是未定义行为。 - Werner Henze
如果anullptr,那么&*a不就是0吗? - Born2Smile
更倾向于使用get,因为这是它的用途,更清晰地传达了意图,并且更易于阅读。 - sp2danny
1个回答

6
如果指针为nullptr,则&*a是未定义的行为。您可以在这里了解更多关于未定义行为的内容。
在所有其他情况下,我期望两种解决方案都是相当等效的。我更喜欢使用get(),因为这是每个人都能理解的直接方式。
来自C++标准:
20.9.1.2.4独特指针观察者[unique.ptr.single.observers]
typename add_lvalue_reference::type operator*() const;
1要求:get()!= nullptr。
2返回值:*get()。

+1 踩准了标准呢!:) 我试着用每个编译器编译一次.. g++ -o test test.cpp.. 二进制文件不同,所以不完全一样,我猜。虽然不太确定如何判断哪个更快.. - Born2Smile
1
@born2smile 使用优化器(-O)并进行比较。 - user2672107
您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - Born2Smile
@Born2Smile:未定义行为的行为是未定义的。;-] - ildjarn

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接