[英]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.