簡體   English   中英

成員初始化列表錯誤的統一初始化

[英]Uniform initialization on member initializer list error

我在這個C ++ 11代碼上遇到編譯錯誤,但我不知道為什么。 這是代碼:

#include <condition_variable>

class NonCopiableClass
{
    std::condition_variable condition_;
};

struct NonCopiableStruct
{
    std::condition_variable condition_;
};

class Test
{
 public:
    Test() : 
        myClass{},
        myStruct{}
    {};
 private:
    NonCopiableClass myClass;
    NonCopiableStruct myStruct;
};

Visual Studio 2015失敗,出現以下錯誤:

錯誤C2280:'std :: condition_variable :: condition_variable(const std :: condition_variable&)':嘗試引用已刪除的函數1> c:\\ program files(x86)\\ microsoft visual studio 14.0 \\ vc \\ include \\ mutex(550 ):注意:請參閱'std :: condition_variable :: condition_variable'的聲明。

如果我將Test constructor更改為不使用C ++ 11統一初始化Struct則編譯好。

Test() : 
        myClass{},
        myStruct() // <--- CHANGE
    {};

我不明白為什么Struct類型使用復制構造函數,但Class似乎沒問題。 它只發生在具有不可復制成員的Struct上。

我還注意到,如果我在Test Class成員初始化列表之外初始化Struct它可以工作:

int main()
{
    NonCopiableStruct a{};   
    return 0;
}

不知道為什么這段代碼失敗了? 引擎蓋下發生了什么? myClass初始化和myStruct初始化有什么區別? 如果在類成員initializer list使用它,為什么它不會編譯但是我可以在外面使用它嗎? 我試過GCC ,似乎沒事。

這似乎是一個MSVC錯誤。 區別在於struct版本是聚合,而class版本不是(由於默認的私有訪問說明符)。

類版本是由{}初始化的值。 struct版本是聚合初始化的。 一致的編譯器應該只列出初始化condition_ with {} ,因為你沒有為它提供初始化器。

但是,MSVC似乎對於聚合的成員是從初始化列表中的相應初始化器初始化的事實感到磕磕絆絆。 它似乎檢查復制c'tor,即使它不應該實際使用它。

當在成員初始化列表之外初始化相同類型的對象時,它知道該怎么做,這進一步支持了這一點。

暫無
暫無

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

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