ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

c – 查看std :: unique_ptr及其nullptr_t构造函数

2019-08-24 21:05:23  阅读:196  来源: 互联网

标签:c c11 unique-ptr nullptr


我试图理解为什么unique_ptr有一个nullptr_t构造函数

constexpr unique_ptr::unique_ptr( nullptr_t );

我假设这是因为正常的一个参数构造函数是显式的,因此会拒绝nullptr值:

explicit unique_ptr::unique_ptr( pointer p );

但是当我构建一个例子时,编译器很好:

namespace ThorsAnvil
{
    template<typename T>
    class SmartPointer
    {
        public:
            SmartPointer()      {}
            explicit SmartPointer(T*){}
    };
}


template<typename T>
using SP    = ThorsAnvil::SmartPointer<T>;
int main()
{

    SP<int>     data1;
    SP<int>     data2(new int);  // fine
    SP<int>     data3(nullptr);  // fine
}

这是输出:

> g++ --version
Configured with: --prefix=/Applications/Xcode.app/Contents/Developer/usr --with-gxx-include-dir=/usr/include/c++/4.2.1
Apple LLVM version 6.0 (clang-600.0.56) (based on LLVM 3.5svn)
Target: x86_64-apple-darwin14.0.0
Thread model: posix
> g++ -Wall -Wextra -std=c++11 SP1.cpp

为什么std :: unique_ptr需要额外的构造函数来获取nullptr_t参数?

解决方法:

SP<int>     data3(nullptr);  // fine

您正在使用直接初始化,这会导致考虑显式构造函数.尝试以下操作,您的代码将无法编译

SP<int>     data4 = nullptr;

现在添加以下构造函数,上面的行将编译

SmartPointer(std::nullptr_t){}

因此,nullptr_t构造函数使unique_ptr在您想要将其初始化为nullptr的情况下表现得像原始指针,但在其他可能实际为其指定原始指针的情况下避免任何意外的所有权转移.

标签:c,c11,unique-ptr,nullptr
来源: https://codeday.me/bug/20190824/1711884.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有