किसी भी 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
के लिए एक विशेष मामला है दिया? क्या यह जानबूझकर या मानक में एक निरीक्षण है?
जीसीसी 4.8 इसे दूसरे तरीके से कर रहा है (या libstdC++ इसके साथ आ रहा है) काम 'sizeof (std :: सरणी) == 1' के बाद से। लेकिन मुझे एहसास है कि आपने कहा "एक * संभव * कार्यान्वयन" और मैं तर्क स्वीकार करता हूं, इसलिए धन्यवाद! –
जीसीसी 'value_type _M_instance [_Nm करता है? _Nm: 1]; 'और मैं' sizeof (array) == आकार (int) ' –
देखता हूं, मैं liveWorkSpace.org पर जीसीसी 4.8 के लिए 'sizeof (std :: array) == 1' देखता हूं। अजीब। –