簡體   English   中英

直接初始化與值初始化

[英]Direct Initialization vs. Value Initialization

我是一名試圖學習C ++ 11的C程序員,但遇到了一些我不了解的東西。 據我所知,以下問題是值初始化和直接初始化之間的區別。

以下代碼段無法使用Visual Studio進行編譯:

class TestClass {
    int _val;
    std::string _msg;
public:
    TestClass(int, std::string);
    void action();
};

TestClass::TestClass(int val, std::string msg)
    : _val{val}, _msg{msg}
{
}

void TestClass::action()
{
    std::cout << _msg << _val << std::endl;
}

它給了我:

錯誤C2797:“ TestClass :: _ msg”:成員初始化程序列表或非靜態數據成員初始化程序內部的列表初始化未實現

但是,改變

TestClass::TestClass(int val, std::string msg)
    : _val{val}, _msg{msg}

TestClass::TestClass(int val, std::string msg)
    : _val{val}, _msg(msg)

解決我的問題。 這兩種初始化形式之間有什么區別,什么時候應該使用一種? 導致我相信,在處理顯式類型時,應該使用值初始化。

這是Visual C ++編譯器的實現細節。 您可以在此處閱讀有關此錯誤的更多信息。 該頁面指出:

Visual Studio中的C ++編譯器未在成員初始值設定項列表或非靜態數據成員初始值設定項內實現列表初始化

您的代碼嘗試實現第一種情況。 您提出的解決方案可以解決此問題,但是如果您仍然希望以某種方式在構造函數中使用初始化列表,則可以執行以下操作:

TestClass::TestClass(int val, std::string msg)
    : _val{val}, _msg(std::string{msg})

它將按您的預期工作。

暫無
暫無

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

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