2015-12-21 62 views
1

看來此代碼(所以它編譯罰款),我要問這裏是:是否有保證的sizeof(STD ::陣列)是一樣的sizeof(equivalent_Carray)?std :: array <T, N>的大小是否保證等於T [N]的大小?

struct MyClass { 
    std::array<float, 4> arr; 
    float carr[4]; 

    std::array<float, 4> cfunction() { 
    std::array<float, sizeof(carr)/sizeof(float)> out; 
    return out; 
    } 

    std::array<float, 4> function() { 
    // Is this guaranteed to be the same as sizeof(carr)/sizeof(float)?? 
    std::array<float, sizeof(arr)/sizeof(float)> out; 
    std::cout << sizeof(arr); 
    return out; 
    } 
}; 

int main() 
{ 
    MyClass obj; 
    obj.function(); 
} 
+0

請提出一個有用的問題標題。 –

回答

4

我們與std::array<T, N>得到的唯一保證是:

  • size()N;
  • &a[n] == &a[0] + n所有0 <= n < N;
  • 數組是一個集合體(8.5.1),可以使用語法來初始化

    array<T, N> a = { initializer-list }; 
    

沒有什麼從加入後隨構件停止實施者是,雖然我知道沒有理由一個會。

+0

我不知道爲什麼我不能只用'arr.size()'('隱含使用this指針只允許呼叫的評價爲「constexpr」成員function'內)來初始化我的數組的大小。我的意思..這是一個成員變量,但它也是一個'的std :: array'所以它的大小不能改變 – Dean

+3

@Dean:因爲他們把它非'constexpr'與其它容器的一致性,儘管一成不變的語義。一個恥辱,如果你問我。實際上有人在幾個星期前就問過這個問題。 IIRC在C++ 17中有可能會發生這種變化,但請不要在此引用我的意思。我們真正需要的是一個'static constexpr size_t size()const {return N; }成員函數或任何語法。 –

+0

我同意,這太可怕了。 – Dean