2013-03-20 13 views
20

किसी भी std::array< T, 0 > को देखते हुए, यह खाली क्यों नहीं है? मैं के रूप में "खाली" मतलब है:std :: array < T, 0 > क्यों खाली नहीं है?

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

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::array<int,0> के लिए, खाली आधार अनुकूलन (EBO) पर लागू नहीं होता ।

यह विशेष रूप से मेरे लिए अजीब लग देखते हुए कि std::tuple<> (ध्यान दें: कोई टेम्पलेट पैरामीटर) रिक्त है, जैसे कि, std::is_empty<std::tuple<>>::value उपज true करता है।

प्रश्न: है क्यों कि, कि आकार 0 पहले से ही std::array के लिए एक विशेष मामला है दिया? क्या यह जानबूझकर या मानक में एक निरीक्षण है?

उत्तर

21

मानक के बारे में है कि क्या tuple या array खाली होना चाहिए कुछ नहीं कहा, तुम क्या देख रहे हैं कार्यान्वयन विवरण वहाँ array<T, 0> गैर जा रहा है के लिए एक अच्छा कारण नहीं है जबकि कर रहे हैं, लेकिन वहाँ tuple<> गैर खाली करने के लिए कोई कारण नहीं है, -empty, पर विचार करें:

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

जब पैरामीटर पैक रिक्त है आप प्राप्त करेंगे:

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

प्रारंभकर्ता के लिए मान्य वस्तु एक सदस्य है, जोनहीं किया जा सकता की जरूरत होने के लिएक्योंकि आप शून्य आकार सरणियों नहीं हो सकता सदस्यों, तो एक संभावित क्रियान्वयन int[1]

है के रूप में एक कार्यान्वयन विशेष मामले के लिए पूरे सरणी नहीं है, यह सिर्फ कर सकते हैं:

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

और अन्य सभी सदस्यों, ठीक उसी तरह (यह मानते हुए end()begin()+N के रूप में परिभाषित किया गया है)

+0

जीसीसी 4.8 इसे दूसरे तरीके से कर रहा है (या libstdC++ इसके साथ आ रहा है) काम 'sizeof (std :: सरणी ) == 1' के बाद से। लेकिन मुझे एहसास है कि आपने कहा "एक * संभव * कार्यान्वयन" और मैं तर्क स्वीकार करता हूं, इसलिए धन्यवाद! –

+0

जीसीसी 'value_type _M_instance [_Nm करता है? _Nm: 1]; 'और मैं' sizeof (array ) == आकार (int) ' –

+0

देखता हूं, मैं liveWorkSpace.org पर जीसीसी 4.8 के लिए 'sizeof (std :: array ) == 1' देखता हूं। अजीब। –

संबंधित मुद्दे