2016-07-30 49 views
2

鑑於foo.cpp是一個零初始化std :: atomic <T*>保證等價於用nullptr初始化的一個嗎?

#include <atomic> 

namespace { 
    std::atomic<int*> gets_zero_init; 
    std::atomic<int*> gets_nullptr{nullptr}; 
} 

我相信gets_zero_init是零初始化,並且它的初始化後,零初始化完成。我也確信gets_nullptr最終將被初始化爲nullptr,我還相當確信gets_nullptr的初始化在零初始化後不完成,因爲std::is_trivially_constructible<decltype(gets_nullptr), int*>::valuefalse(至少它是在我的編譯器上)。然而,我仍然不清楚gets_nullptr是否在恆定初始化,靜態初始化或動態初始化之後完全初始化。這是什麼?另外,爲了說明起見,我可以說我有興趣確保感興趣的對象在零初始化之後完全初始化,並且不需要任何進一步的初始化,所以我採用gets_zero_init方法。由於零初始化,嵌入在gets_zero_init中的指針將保持全零位模式。

確保全零位模式相當於nullptr?換句話說,如果我想要gets_nullptr的語義,我可以依靠gets_zero_init的零初始化來提供嗎?

+0

嘗試過'std :: is_trivially_constructible :: value'? – Yakk

+0

@Yakk是的,我其實先嚐試過。只是雙重檢查,同樣的問題。編譯器是'Apple LLVM 7.3.0版(clang-703.0.31)',使用libC++。 – acm

回答

0

我想我已經想通了。

首先,我的帖子出現錯誤。我沒有意識到zero-init和constant-init只是靜態init的不同形式。你得到一個或另一個,而不是另一個。所以,不要理會這種誤解。

gets_zero_initgets_nullptr獲得靜態初始化,我相信。第一次得到零初始化,顯然有點。第二獲取常數初始化因爲:

  • 所述的std ::原子構造服用T是constexpr
  • 到的gets_nullptr構造的參數是一個常量表達式

換言之,既gets_zero_initgets_nullptr有靜態初始化,因此後者是更好的選擇,因爲它不依賴於假設全零位模式等價於nullptr。