2013-03-20 12 views
20

std::array< T, 0 >があれば、それはなぜ空ではないですか?なぜstd :: array < T, 0 >が空でないのですか?

std::array<int,0>のために、空のベースの最適化(EBO)が適用されていないことを false

#include <iostream> 
#include <tuple> 
#include <array> 

struct Empty {}; 

int main() 
{ 
    std::cout << sizeof(std::tuple<int>) << std::endl; 
    std::cout << sizeof(std::tuple<int,Empty>) << std::endl; 
    std::cout << sizeof(std::tuple<int,std::array<int,0>>) << std::endl; 
} 

利回り

4 
4 
8 

意味し、帰国

std::is_empty< std::array< int, 0 > >::value 

:私はのような "空" を意味します。

このstd::tuple<>(注:テンプレートパラメータ)ことを考えると私には特に奇妙に思えるすなわち、std::is_empty<std::tuple<>>::valuetrueを得ない、空です。

質問:0のサイズがstd::arrayの特殊ケースの場合、それはなぜですか?スタンダードの意図的な見落としや見落としですか?

答えて

21

標準は、array<T, 0>が非であることのために良い理由があるのに対し、あなたが見ているものは、実装の詳細がありますが、tuple<>が空でないようにする理由はありませんtupleまたはarrayが空であるべきかどうかについては何も言いません。 -empty、考慮してください。

std::array<int, sizeof...(values)> = { { values... } }; 

をパラメータパックが空の場合、あなたが取得したい:

std::array<int, 0> = { { } }; 

を初期化するために、オブジェクトがメンバー、0123をすることはできません必要が有効であるとint[1]

実装が特殊な場合に全体の配列を持っていないされて可能な実装ので、あなたがメンバーとしてゼロ・サイズの配列を持つことができないので、それだけで行うことができます。

T m_data[N == 0 ? 1 : N]; 

をし、他のすべてのメンバーがまったく同じ方法(end()と仮定するとbegin()+Nとして定義される)

+0

仕事GCC 4.8は== '1'はsizeof(STD ::配列)以来、違っそれを行う(またはのlibstdC++、それに来て)いるようです。しかし、あなたは "one * possible * implementation"と言っていると思います。私は推論を受け入れます。ありがとう! –

+0

GCCは 'value_type _M_instance [_Nm? 'sizeof(int)' –

+0

私はLiveWorkSpace.orgの 'sizeof(std :: array )== 1'をGCC 4.8で見ています。奇妙な。 –

関連する問題