2014-07-10 278 views
0

我面臨着一個值初始化與集合初始化混合的問題。 到目前爲止,我試圖依靠做我所有的初始化是這樣的:值初始化vs集合初始化

自動無功=類型{};

(是的,我知道大括號初始化男星VS默認構造函數的陷阱的。因此,沒有有關意見,請!)

我希望這會正確「歸零」或init VAR的記憶。

但在VS 2013更新2,我看到:

#include <string> 
#include <iostream> 

using namespace std; 


struct B 
{ 
    double g[10]; 
    std::string str; 
}; 

struct C 
{ 
    double g[10]; 
}; 

struct A 
{ 
    double a[3]; 
    double b = 0; 
    double d; 
    struct B b_stuff; 
    struct C c_stuff; 
    A() : b_stuff{}, c_stuff{} {} 
}; 

int main() 
{ 
    auto a = A{}; 
    double big[50] = {}; 

    for(auto b : a.b_stuff.g) { cout << b << " "; } 
    cout << endl; 
    cout << endl; 
    for(auto b : a.c_stuff.g) { cout << b << " "; } 
    cout << endl; 
    cout << endl; 
    for (auto b : big) { cout << b << " "; } 

    return 0; 
} 

輸出是這樣的:

-9.25596e+061 -9.25596e+061 -9.25596e+061 -9.25596e+061 -9.25596e+061 -9.25596e+061 -9.25596e+061 -9.25596e+061 -9.25596e+061 -9.25596e+061 

0 0 0 0 0 0 0 0 0 0 

0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 

隨着GCC 4.7.2:

0 0 0 0 0 0 0 0 0 0 

0 0 0 0 0 0 0 0 0 0 

0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 

我讀到這但我看不到這種非歸零行爲的原因:

http://en.cppreference.com/w/cpp/language/value_initialization http://en.cppreference.com/w/cpp/language/aggregate_initialization

那麼,VS 2013的越野車呢?爲什麼它不會將a.b_stuff.g數組清零?

+0

你是對的,是一個MSVC錯誤。你正確地初始化'b_stuff'(我在寫回答時已經錯過了那行)。 – Manu343726

+0

呵呵,「好」。我開始恐慌/希望我錯過了一些明顯的事情。如果這是真的MSVC的錯誤則是壞消息...... –

+0

嘗試使用級值初始化,其允許的,因爲C++ 11,但我不知道,如果微軟的人實現了它:HTTP:/ /coliru.stacked-crooked.com/a/e1e6d42289ce54ee – Manu343726

回答