【发布时间】:2019-01-25 12:12:52
【问题描述】:
#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>’
}
都是int,为什么0而1可以转换成std::shared_ptr<T>?
编译时如何检查1到std::shared_ptr<T>的转换失效?
编译时如何检查1到std::nullptr_t的转换失效?
【问题讨论】:
-
请始终包含您的问题所需的头文件,以使其有意义。我已在您的问题中添加了所需的标题。
-
这样做是为了保持与早于 C++11 的版本的兼容性,其中 NULL 是
(void *)0,0被转换为任何类型的指针。 -
@MarekR:在 C++ 的任何版本中,
NULL都不是(void *)0;这是 C 标准承认的定义,但 C++ 标准不承认(因为,由于对指针类型的检查更严格,使用起来会变得非常不方便)。 -
@MatteoItalia 不允许
(void *)0作为空指针值纯粹是一个任意决定。它与“更严格地检查指针类型”无关。承认(void *)0为有效的NULL可以避免一些但不是所有问题。 -
@curiousguy 是的,考虑一下,已经 0 是分配 和初始化 到指针的特例,我认为没有理由不将其转换为
void *.. . 我想知道为什么他们选择使用普通的 0...
标签: c++ c++11 pointers shared-ptr nullptr