2015-12-21 63 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