[英]Pass initializer list to function for initialization of std::array
[英]std::array initializer list initialization in initialization list
盡管我非常喜歡C ++ 11的新功能,但有時我仍感覺缺少其某些細微之處。
初始化int數組可以正常工作,初始化Element2向量可以正常工作,但是初始化Element2數組失敗。 我認為正確的語法應該是未注釋的行,但是對我而言,沒有任何初始化嘗試成功。
#include <array>
#include <vector>
class Element2
{
public:
Element2(unsigned int Input) {}
Element2(Element2 const &Other) {}
};
class Test
{
public:
Test(void) :
Array{{4, 5, 6}},
Array2{4, 5},
//Array3{4, 5, 6}
Array3{{4, 5, 6}}
//Array3{{4}, {5}, {6}}
//Array3{{{4}, {5}, {6}}}
//Array3{Element2{4}, Element2{5}, Element2{6}}
//Array3{{Element2{4}, Element2{5}, Element2{6}}}
//Array3{{{Element2{4}}, {Element2{5}}, {Element2{6}}}}
{}
private:
std::array<int, 3> Array;
std::vector<Element2> Array2;
std::array<Element2, 3> Array3;
};
int main(int argc, char **argv)
{
Test();
return 0;
}
我已經在MinGW的g ++ 4.6.1和4.6.2上嘗試過這個。
我應該如何正確初始化該數組? 可能嗎?
解決此問題的正確方法是Array{{4, 5, 6}}
。 使用聚合初始化初始化成員時,不能省略花括號。 您唯一可以省略花括號的形式是在以下形式的聲明中
T t = { ... }
因此,在您的情況下,您必須輸入所有大括號:一個用於std::array
本身,另一個用於int
數組。 對於Array3
,您的語法也是正確的,因為int
可以隱式轉換為Element2
。
在其余的評論中, Array3{{{4}, {5}, {6}}}
, Array3{{Element2{4}, Element2{5}, Element2{6}}}
和Array3{{{Element2{4}}, {Element2{5}}, {Element2{6}}}}
工作,但比較羅word。 但是從概念Array3{{{4}, {5}, {6}}}
會在不執行復制省略的實現上產生最少的臨時數量(我想這是無關緊要的,但還是很容易知道),甚至更少而不是Array3{{4, 5, 6}}
,因為您不是使用復制初始化,而是使用Element2
復制列表初始化,這在設計上不會產生中間臨時對象。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.