2015-01-08 81 views
2

這裏是我的代碼:C++傳遞初始化列表作爲參數將構造一個對象嗎?

struct MyTest{ 
    int a; 
    char b; 
}; 
void testFunc(MyTest mt){ 
    cout << mt.a << mt.b << endl; 
} 
void main(){ 
    testFunc({ 1, 'c' }); 
} 

似乎噸將得到構建從initializer_list和testFunc將輸出正確的結果。但是,由於我沒有實現一個接受initializer_list的構造函數,因此怎麼會這樣。

+1

使用'int main()' –

回答

7

這個類是 - 一個包含公共數據成員的簡單結構以及無用戶定義的構造函數等。

集合類型支持列表初始化;初始化列表的元素依次用於初始化每個數據成員。這已被支持在C和C++變量初始化爲一個很長的時間:

MyTest x = {1, 'c'}; 

和C++ 11擴展這對初始化臨時函數列表初始化的其他用途,包括(在這種情況下)論據。

3

列表初始化正在發生。由於(如在C)可以用

MyTest mt = {1, 'c'}; 

初始化的類型相同的初始化發生在呼叫

(N3690)的點8.5/17 [...]

- 如果初始化爲(非括號內)支撐-INIT列表,該對象或參考列表是初始化

8.5.4/3給出了例如:

struct S2 { // OK 
    int m1; 
    double m2, m3; 
}; 
S2 s21 = { 1, 2, 3.0 }; // OK 

使用初始值設定項列表調用函數的行爲方式相同。進一步:

(8.5.1/1)聚合是一個沒有用戶提供的構造函數(12.1),沒有私有或受保護的非靜態數據成員(第11章)的數組或類(第9章) ,沒有基類(第10章),也沒有虛函數(10.3)。當按照8.5.4的規定初始化器列表對初始化器列表進行初始化時,初始化器列表的元素將作爲聚合器成員的初始化器,以下標或成員順序遞增。

-4

嗯,首先你的主要功能是錯誤的:

int main() { 
/* ... code ... here */ 
return 0; 
} 

其次,你需要一個對象來初始化你的結構:

#include <iostream> 

struct Foo { 
    char _a; 
    int _b; 
}; 

void print_them (const Foo& foo) { 
    std::cout << foo._a << ", " << foo._b << std::endl; 
} 

int main() { 
    /* create object and initialize it */ 
    Foo f = { 
     'a', 7 
    }; 
    /* call function */ 
    print_them (f); 
    return 0; 
} 
+0

fyi,'main'會隱含'返回0;'如果到達末尾。你可以省略回報。這隻適用於'主' –

+0

不,他不需要一個單獨的對象來初始化他的結構。他的代碼很好。這並沒有回答這個問題。 – bolov

0

在C++ 11中,我們不必爲POD定義構造函數。我們可以使用新的列表初始化語法:

MyTest mt{1, 'c'}; 
MyTest mt2 = {1, 'c'}; 

這就是你的代碼中調用的內容。

相關問題