當我看到這個 CPP Con 2017 網路研討會時,Fedor Pikus 說:“它必須是直接初始化”
這是網路研討會的鏈接。
這些初始化方法有什么區別?(隨后,為什么它必須是“直接”初始化?為什么“間接”初始化是“NOT”?)
// C 17 Compiler
#include <atomic>
class Example
{
std::atomic<bool> m_b1 = false; // 1-h
std::atomic<bool> m_b2{ false }; // 2-h
static void doSomethng()
{
std::atomic<bool> b1 = false; // 1-f
std::atomic<bool> b2{ false }; // 2-f
std::atomic<bool> b3(false); // 3-f
// Do something
}
};
uj5u.com熱心網友回復:
std::atomic不可復制或移動。
在 C 17 之前,復制初始化std::atomic<int> x = 0;將首先構造一個臨時物件,然后從該臨時物件直接std::atomic<int>初始化。如果沒有移動或復制建構式,這將失敗,因此該行無法編譯。0x
std::atomic<int> x(0);然而是直接初始化,只會使用建構式x的引數0進行構造。
由于 C 17 沒有臨時性,并且在任何情況下x都將直接由建構式呼叫以0作為引數進行初始化,因此不std::atomic存在不可移動的問題。從這個意義上說,幻燈片現在已經過時了。
即使在這種情況下,復制初始化和直接初始化的行為現在相同,但總的來說兩者之間仍然存在差異。特別是直接初始化選擇建構式通過多載決議直接初始化變數,而復制初始化嘗試找到隱式轉換序列(可能通過轉換建構式或具有不同多載決議規則的轉換函式)。此外,與直接初始化相比,復制初始化不考慮標記的建構式explicit。
關于問題中的代碼片段。1-h并且1-f是如上所述的復制初始化。3-f是上面的直接初始化。2-h并且2-f是直接串列初始化,在某些情況下其行為與其他兩種方式不同,但在這里它與帶括號的直接初始化具有相同的效果。
一般來說,解釋初始化形式之間的所有差異需要一段時間。眾所周知,這是 C 中最復雜的部分之一。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/460434.html
上一篇:指向模板類的共享指標向量
下一篇:洗掉期間的分段錯誤[]
