cha*_*ink 3 c++ pointers shared-ptr nullptr c++11
#include <memory>
void f1(std::shared_ptr<bool> ptr) {}
int main() {
f1(0); // OK
f1(1); // compilation error: could not convert ‘1’ from ‘int’ to ‘std::shared_ptr<bool>’
}
Run Code Online (Sandbox Code Playgroud)
既为int,为什么0但1可以转换为std::shared_ptr<T>?
如何从转换的残疾1来std::shared_ptr<T>编译时进行检查?
如何从转换的残疾1来std::nullptr_t编译时进行检查?
0是C/C++中的特殊值.许多事情都有效,0但没有1.原因是语言的转换规则.
f1(0); // OK
Run Code Online (Sandbox Code Playgroud)
由于以下转换,这没关系.
0 -> nullptr
nullptr -> std::shared_ptr<bool> // Through a constructor
Run Code Online (Sandbox Code Playgroud)
然而,
f1(1);
Run Code Online (Sandbox Code Playgroud)
因为没有转换可用于转换1为a,所以不行shared_ptr<bool>.
std::shared_ptr<T>有一个构造函数std::nullptr_t,它有一个隐式转换,来自任何有效的空指针常量,包括一个普通的0文字.另一方面,1它不是任何shared_ptr构造函数的有效参数.