Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/134.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 为什么我可以将0转换为std::shared\u ptr<;T>;但不是1? #包括 void f1(std::shared_ptr ptr){} int main(){ f1(0);//好的 f1(1);//编译错误:无法将“1”从“int”转换为“std::shared\u ptr” }_C++_C++11_Pointers_Shared Ptr_Nullptr - Fatal编程技术网

C++ 为什么我可以将0转换为std::shared\u ptr<;T>;但不是1? #包括 void f1(std::shared_ptr ptr){} int main(){ f1(0);//好的 f1(1);//编译错误:无法将“1”从“int”转换为“std::shared\u ptr” }

C++ 为什么我可以将0转换为std::shared\u ptr<;T>;但不是1? #包括 void f1(std::shared_ptr ptr){} int main(){ f1(0);//好的 f1(1);//编译错误:无法将“1”从“int”转换为“std::shared\u ptr” },c++,c++11,pointers,shared-ptr,nullptr,C++,C++11,Pointers,Shared Ptr,Nullptr,作为int,为什么0而1可以转换为std::shared\u ptr 编译时如何检查从1转换为std::shared\u ptr的无效性 编译时如何检查从1到std::nullptr\u t的转换无效性?0是C/C++中的一个特殊值。很多东西可以使用0,但不能使用1。原因是语言的转换规则 #include <memory> void f1(std::shared_ptr<bool> ptr) {} int main() { f1(0); // OK f

作为
int
,为什么
0
1
可以转换为
std::shared\u ptr


编译时如何检查从
1
转换为
std::shared\u ptr
的无效性


编译时如何检查从
1
std::nullptr\u t
的转换无效性?

0
是C/C++中的一个特殊值。很多东西可以使用
0
,但不能使用
1
。原因是语言的转换规则

#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>’
}
这没关系,因为有以下转换

f1(0); // OK

由于无法将
1
转换为
shared_ptr

std::shared_ptr
的构造函数采用
std::nullptr_t
,对于该构造函数,存在来自任何有效空指针常量的隐式转换,其中包括普通
0
文本。另一方面,
1
不是任何
共享\u ptr
构造函数的有效参数

除了其他答案外,一种解决方法是使用宏:

f1(1);
f1(标准::使_共享(0));//好啊
f1(标准::使_共享(1));//好啊
通过这种方式,您将能够向函数提供任何整数文本。简单的工作示例:

f1(std::make_shared<bool>(0)); // OK
f1(std::make_shared<bool>(1)); // OK
#包括
#包括
无效f1(标准::共享ptr ptr){

std::cout请始终包含您的问题所需的头文件以使其有意义。我已将所需的头文件添加到您的问题中。这样做是为了保持与早于C++11的版本的兼容性,其中NULL是
(void*)0 < /COD>和 0代码>代码转换为任何一种指针。@ MaRKR:在没有版本的C++ >代码> NULL//COD>是<代码>(空缺*)0 < /C>;这是C标准所承认的定义,但不是C++的定义(因为,由于指针类型的严格检查,使用起来会非常不方便)。@MatteoItalia不允许将
(void*)0作为空指针值纯粹是任意决定。这与“更严格地检查指针类型”无关。允许
(void*))0
作为一个有效的
NULL
可以避免一些但不是所有的问题。@curiousguy yep,考虑到它,作为指针赋值和初始化的特例,我认为没有理由不将其强制转换为
void*
…我想知道为什么他们选择使用纯0…转换的障碍是如何从<代码>1
std::nullptr\u t
编译时要检查吗?@chaosink,你必须相信你的编译器会给你一个适当的错误消息。我从g++得到以下信息:错误:无法将“1”从“int”转换为“std::shared\u ptr”是的,我信任它。我只是想知道编译器如何检测到这个错误?似乎没有是否该检测超出了语言属性。或者它只是标准中的一项?因此编译器直接实现它?@chaosink,文本
0
在语言中是特殊的。编译器必须知道如何区别对待文本
0
1
。请注意,如果使用
int i=0;f1(i)
当使用
f1(1);
@chaosink时,您将收到类似的错误消息。实际上,更糟糕的是,它不仅仅是文字整数,而是在一般的常量整数表达式中。
!!!!!!!!!!!编译器必须将1
识别为有效的空指针值,因此(1)可分配给指针类型的任何左值和(2)可转换为
std::nullptr\u t
。编译时如何检查从
1
转换为
std::nullptr\u t
的无效性?@chaosink这意味着什么?编译器知道1不是有效的空指针常量,因此不考虑转换为
std::nullptr\t
,因此会显示错误消息如果问题是,你将如何编写一个像
nullptr\t
这样的类型,它只能从一个特定的整数值转换,我怀疑答案是“你不能”“代码> NulpTrpRt确实是非常神奇的,它需要一些特定的情况下的核心语言修改,而不仅仅是一个库修改——因为这是由编译器实现的特例。对于一种语言来说,它是不雅的。因此这是另一个例子,显示了现代C++对遗留C++的沉重负担。处理0。具有空指针常量是C的传统成本,但与许多其他特性相比,这是一个非常小的成本,例如内置数组表现不好(不是可以指定的第一类对象)或其他难以传授的数组规则。
f1(std::make_shared<bool>(0)); // OK
f1(std::make_shared<bool>(1)); // OK
#include <iostream>
#include <memory>

void f1(std::shared_ptr<bool> ptr) {
    std::cout << std::boolalpha << *ptr << '\n';    
}

int main() {
    f1(std::make_shared<bool>(0)); // OK
    f1(std::make_shared<bool>(1)); // OK
    f1(std::make_shared<bool>(2)); // OK
}