![](/img/trans.png)
[英]Why I am able to assign constant shared_ptr to non constant shared_ptr in C++?
[英]Can I assign 0 to a shared_ptr? Why?
我意識到以下編譯在GCC 4.7中很好:
#include <memory>
int main() {
std::shared_ptr<int> p;
p = 0;
}
但是,從沒有賦值運算符int
或int*
,並且有來自要么沒有隱式構造函數int
或int*
無論是。 int*
有一個構造函數,但是那個是明確的。 我檢查了標准庫實現,構造函數確實是顯式的,並且看不到任何可疑的賦值運算符。
該計划實際上是否格式正確或海灣合作委員會與我搞混?
這有效的原因是標准的這個簡短引用:
§4.10 [conv.ptr] p1
空指針常量是整數類型的整數常量表達式 (5.19)prvalue, 其計算結果為零或類型為
std::nullptr_t
。 [...]整數類型的空指針常量可以轉換為std::nullptr_t
類型的prvalue。 [...]
事實上std::shared_ptr
有一個來自std::nullptr_t
的隱式構造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);
}
您只能將共享指針分配給共享指針的另一個實例。 無法分配shared_pointer保留的類型。 Afaik這是運營商唯一的超載:
shared_ptr& operator=(const shared_ptr& r);
你正在做的是將0(在這種情況下等於NULL)分配給指針,而不是類型的值。 您在此代碼中甚至未對類型進行初始化。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.