我意识到以下编译在GCC 4.7中很好:
#include <memory>
int main() {
std::shared_ptr<int> p;
p = 0;
}
但是,int
或int*
没有赋值运算符,int
或int*
也没有隐式构造函数。有int*
的构造函数,但那个是明确的。我检查了标准库实现,构造函数确实是显式的,并且看不到任何可疑的赋值运算符。
该计划实际上是否格式正确或海湾合作委员会与我搞混?
答案 0 :(得分:16)
这样做的原因是标准的简短引用:
§4.10 [conv.ptr] p1
空指针常量是整数类型的整数常量表达式(5.19)prvalue,其评估为零或类型为
std::nullptr_t
的prvalue。 [...]整数类型的空指针常量可以转换为std::nullptr_t
类型的prvalue。 [...]
std::shared_ptr
具有来自std::nullptr_t
的隐式构造函数的事实:
§20.7.2.2 [util.smartptr.shared] p1
constexpr shared_ptr(nullptr_t) : shared_ptr() { }
这也允许这样的奇怪:
#include <memory>
void f(std::shared_ptr<int>){}
int main(){
f(42 - 42);
}
答案 1 :(得分:0)
您只能将共享指针指定给共享指针的另一个实例。无法分配shared_pointer保留的类型。 Afaik这是运营商的唯一重载:
shared_ptr& operator=(const shared_ptr& r);
您正在做的是将0(在本例中等于NULL)分配给指针,而不是类型的值。您的类型在代码中此时甚至没有初始化。