gpt4 book ai didi

c++ - 为什么我的 shared_ptr 能够从原始指针隐式构造?

转载 作者:太空宇宙 更新时间:2023-11-04 15:29:08 26 4
gpt4 key购买 nike

我在我的应用程序中放置了一个类 std::shared_ptr , 转换现有代码。我的理解是 shared_ptr来自原始指针的构造函数是显式的(例如 http://www.cplusplus.com/reference/memory/shared_ptr/shared_ptr/ ),这对我来说意义重大。但是,我在我的应用程序中看到一件奇怪的事情,在我看来,构造函数的行为就好像它是隐式的一样。我不明白这怎么可能。

首先,我有一个typedef对于我的 shared_ptr输入:

typedef std::shared_ptr<EidosPropertySignature const> EidosPropertySignature_CSP;

然后我有一些代码可以构造一个新对象并将其添加到共享指针 vector 中:

std::vector<EidosPropertySignature_CSP> properties;

properties.emplace_back(new EidosPropertySignature(...constructor parameters...));

这个编译甚至没有警告。我不明白 - new EidosPropertySignature 的结果是一个 EidosPropertySignature * ,不应隐式转换为 EidosPropertySignature_CSP vector 成立,对吗?我非常希望这个构造产生一个编译错误,正如我所想的那样。为什么没有,我有没有办法修改我的方法以使其可以?

最佳答案

这里没有隐式转换。 emplace_back将其参数直接转发给元素类型的构造函数以构造新元素 [sequence.reqmts] :

Appends an object of type T constructed with std​::​forward<​Args​>(​args)....

因此,emplace_back本质上是一个直接的构造函数调用。 push_back ,另一方面,将不起作用,因为这实际上需要转换......

在纯粹的概念层面上,隐式转换是关于允许将某种类型的值转换为不同类型的值如有必要,可能作为较长转换序列的一部分。转换是关于搭建桥梁。通过隐式转换,您告诉编译器:这是来自 A 的桥至 B ,您可以使用它来四处走动。通过显式转换,您说:这是来自 A 的一座桥至 B ,只有在我明确告诉你去 B 时才使用它;特别是,如果你只是想通过 B 前往其他地方,请不要使用它.当你写 emplace_back ,您明确说“构造一个元素”。 emplace_back 明确地表示要创建元素类型的对象。您明确告诉编译器转到B . emplace_back 没有任何暗示……

关于c++ - 为什么我的 shared_ptr 能够从原始指针隐式构造?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59269262/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com