簡體   English   中英

nullptr_t是默認的可構造類型嗎?

[英]Is nullptr_t a default constructible type?

我無法從C ++ 11標准中看出nullptr_t是否有默認構造函數。 換句話說,以下是否有效?:

nullptr_t n; 

GCC和VC ++允許上面的代碼,但clang沒有。 我在標准中找不到任何指定它沒有默認構造函數的東西,我能找到它表明它應該。 這對我很重要,因為我正在為較舊的編譯器支持編寫nullptr的基本回退實現,並且需要知道是否需要為其提供默認構造函數。

標准說的是什么

標准說(18.2)

nullptr_t定義如下:

 namespace std { typedef decltype(nullptr) nullptr_t; } 

nullptr_t是同義詞的類型具有3.9.1和4.10中描述的特征。

其中3.9.1基本上表示它應該與void*具有相同的大小,4.10指定nullptr的轉換規則。

編輯: 3.9.9進一步明確聲明nullptr_t是標量類型,這意味着8.5的內置類型的預期初始化規則適用:

  • 默認初始化( nullptr_t n; ),它nullptr_t n; n未定義的值。 正如Johannes Schaub正確指出的那樣,這與最新版本的Clang編譯得很好。
  • 值初始化( nullptr_t n = nullptr_t(); ),將n初始化為0。

此行為與例如int相同,因此nullptr_t絕對是默認可構造的。 這里有趣的問題是: nullptr_t具有未定義的值意味着什么? 在一天結束時, nullptr_t只有一個有意義的可能值,即nullptr 此外,類型本身僅通過nullptr文字的語義來定義。 這些語義是否仍適用於單位化值?

為什么這個問題在實踐中無關緊要

您不希望聲明nullptr_t類型的新變量。 該類型唯一有意義的語義已經通過nullptr文字表達,因此每當您使用nullptr_t類型的自定義變量時,您也可以使用nullptr

在實踐中有什么關系

唯一的例外是你可以使用類型為nullptr_t非類型模板參數。 對於這種情況,知道哪些值可以轉換為nullptr_t ,這在4.10中有描述:

空指針常量是整數類型的整數常量表達式(5.19)prvalue,其計算結果為零或類型為std::nullptr_t [...]整數類型的空指針常量可以轉換為std::nullptr_t類型的prvalue。

這基本上就是你所期望的:你可以寫

nullptr_t n = 0;    // correct: 0 is special

但不是

nullptr_t n = 42;   // WRONG can't convert int to nullptr_t

gcc 4.6和Clang SVN都是正確的。

雖然nullptr是語言本身的新增加,但std::nullptr_t只是未命名類型的別名,在cstddef聲明的別名如下:

typedef decltype(nullptr) nullptr_t;

雖然nullptr_t (作為typedef而不是語言關鍵字)未列為基本類型,但它被指定為基本類型(例如,不作為指針類型或類類型)。 因此它沒有默認構造函數,但您仍然可以聲明一個像您所做的變量。 你的變量沒有被初始化,我想知道它的用途是什么以及你從clang得到了什么錯誤信息。

另見這里

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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