關於Why can't I initialise an array of objects if they have private copy constructors?的現有問題明確指向C++ 03。我知道從這個問題,我想要做什麼是不允許在C + + 03中,但我認爲它應該有可能在C + + 11我有一個不可移動的類(稱爲孩子)和我需要在另一個類的構造函數中初始化一個Child數組(稱之爲Parent)。通過「不可移動」,我的意思是一個Child對象的地址必須在該對象的生命週期中保持不變。什麼是正確的方法來做到這一點?如何用已刪除的拷貝構造函數初始化類的數組(C++ 11)
用C++ 11我已經試過如下:
class Child
{
public:
Child (int x) {}
~Child() {}
Child (const Child &) = delete;
};
class Parent
{
public:
Parent() : children {{5}, {7}} {}
private:
Child children[2];
};
此代碼編譯罰款鏗鏘3.5.0,GCC卻4.9.1抱怨說,我試圖使用已刪除拷貝構造函數:
test.cc: In constructor ‘Parent::Parent()’:
test.cc:13:35: error: use of deleted function ‘Child::Child(const Child&)’
Parent() : children {{5}, {7}} {}
^
test.cc:7:5: note: declared here
Child (const Child &) = delete;
^
我讀過有關複製初始化和直接初始化(here和here,例如)之間的區別,我想避免調用使用直接初始化拷貝構造函數。我的語法錯了嗎?這是GCC中的錯誤嗎?或者我正在努力做的事情不可能?
在我看來,這是一個叮叮聲蟲,而不是一個海灣合作委員會的錯誤。如果將clang更改爲「children {Child {5},Child {7}}」,clang就無法編譯代碼,該代碼的行爲應與您發佈的內容相同。解決方法是使用「vector」並放置「Child」對象。 – Praetorian 2014-11-01 02:23:04
g ++成功使用'Child children [2] {{5},{7}};'應該與ctor初始化程序列表中出現相同初始化程序的版本相同;都覆蓋了[dcl.init.list]/3 – 2014-11-01 03:04:13
閱讀初始化部分,這段代碼似乎是正確的; 'children [2] = {{5},{7}}''表示'children [0]'是從'{5}'複製初始化的,也就是'Child c = {5};'並且由[dcl.init.list]再次覆蓋,它調用'c'的構造函數,它需要'int'(不涉及副本)。 – 2014-11-01 03:11:25