首页 > 解决方案 > C++ 用 int 0 问题初始化一个 unique_ptr

问题描述

环境:C++11/14 和 MacOS Clion

首先,我知道构造一个 unique_ptr withnullptr而不是 with更好int: 0,但我只是想知道是什么导致了以下两个编译结果:

// compile just fine
class MyClass {};

void MyFunc(unique_ptr<MyClass>) {

}

int main() {
    MyFunc(0);
    return 0;
}
// compile error
class MyClass {};

void MyFunc(unique_ptr<MyClass>) {

}

int main() {
    MyFunc(int(0));
    return 0;
}

后一个有错误:

注意:候选函数不可行:第一个参数没有从“int”到“unique_ptr”的已知转换

在检查unique_ptr的构造函数后,我发现以下候选:

constexpr unique_ptr( nullptr_t ) noexcept;

所以我进一步尝试:

// good
int main() {
    nullptr_t mynullptr(0);
    return 0;
}

另一方面:

// error
int main() {
    nullptr_t mynullptr(int(0));
    return 0;
}

带有消息:

错误:无法使用“int”类型的右值初始化“std::nullptr_t”类型的变量(又名“nullptr_t”)

nullptr_t mynullptr(int(0));

那么是因为初始化nullptr导致编译错误吗?

标签: c++unique-ptrnullptr

解决方案


归功于 MM 的评论:

文字 0 可以转换为 nullptr ;其他整数表达式可能不会(即使它们是常量并且值为零)


推荐阅读