std::shared_ptr语言 - 我可以使用等号 (=) 进行初始化吗?
std::shared_ptr - can I use equal sign (=) for initialization?
根据我对std::shared_ptr
文档的阅读,您不能使用=
从现有指针初始化shared_ptr
。
如果您希望从现有指针初始化,唯一可用的语法是
std::shared_ptr<int> p3 (new int);
问题
不能使用 =
初始化shared_ptr
是否正确,如下所示:
std::shared_ptr<Foo> pFoo = new Foo(bar);
其他人(在C++方面比我更有经验(表示你可以。
不能以这种方式初始化std::shared_ptr
因为单个参数构造函数标记为 explicit
。
但是,您可以使用以下任一方法对其进行初始化:
std::shared_ptr<Foo> pFoo(new Foo(bar)); //direct-initialization
std::shared_ptr<Foo> pFoo{new Foo(bar)}; //direct-list-initialization
或:
std::shared_ptr<Foo> pFoo = std::shared_ptr<Foo>(new Foo(bar)); //copy-initialization
std::shared_ptr<Foo> pFoo = std::shared_ptr<Foo>{new Foo(bar)}; //copy-initialization
最好还是使用通常执行单个分配的std::make_shared<Foo>
:
auto pFoo = std::make_shared<Foo>(bar);
不能使用语法初始化std::shared_ptr
,例如
std::shared_ptr<int> p3 = new int;
因为构造函数被标记为显式 [源]
template <class Y>
explicit shared_ptr(Y* ptr);
这种形式的初始化涉及将右侧隐式转换为shared_ptr<int>
,并且不允许隐式转换调用显式构造函数。
你是对的:语法是非法的。您链接到的文档中的第三个构造函数标记为 explicit
,这意味着正确符合标准的编译器和标准库实现将不允许类似 std::shared_ptr<int> int_ptr = new int(5);
。
有问题的用户可能没有使用正确符合要求的编译器/库,或者可能用于没有此限制的手动滚动shared_pointer对象。
相关文章:
- 是否可以初始化不可复制类型的成员变量(或基类)
- C++使用整数的压缩数组初始化对象
- C++初始化基类
- 多成员Constexpr结构初始化
- 复制列表初始化的隐式转换的等级是多少
- 内联映射初始化的动态atexit析构函数崩溃
- 如何在C++中初始化嵌套类中的2个memeber
- 如何声明特征矩阵,然后通过嵌套循环初始化它
- 没有用于初始化C++中的变量模板的匹配构造函数
- 在未初始化映射的情况下,将值插入到映射的映射中
- C++成员初始化
- 为什么在C++中首先初始化成员类
- 同时具有"聚合初始化"和"模板推导"
- 初始化具有非默认构造函数的std::数组项的更好方法
- 是否可以在编译时初始化数组,以便在运行时不会花费时间?
- CLANG 编译器 说:变量"PTR"可能未初始化
- 在malloc()之后初始化结构中对ptr的引用
- 唯一ptr初始化断言失败
- 使用boost lambda构造创建初始化的智能ptr的容器
- "int* ptr = int()"值初始化如何不违法?