簡體   English   中英

我可以將0分配給shared_ptr嗎? 為什么?

[英]Can I assign 0 to a shared_ptr? Why?

我意識到以下編譯在GCC 4.7中很好:

#include <memory>

int main() {
    std::shared_ptr<int> p;
    p = 0;
}

但是,從沒有賦值運算符intint* ,並且有來自要么沒有隱式構造函數intint*無論是。 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM