2017-12-15 120 views
7
#include <array> 
using std::array; 

constexpr auto d1=2; 
constexpr auto d2=3; 
constexpr auto d3=4; 

// stacked std::array 
using arr_t = array<int,d1>; 
using arr2d_t = array<arr_t,d2>; 
using arr3d_t = array<arr2d_t,d3>; 
constexpr arr3d_t arr1 = {{ 
    {{ {1,2}, {3,4}, {5,6} }}, 
    {{ {1,2}, {3,4}, {5,6} }}, 
    {{ {1,2}, {3,4}, {5,6} }}, 
    {{ {1,2}, {3,4}, {5,6} }} 
}}; 

// built-in array 
using carr3d_t = int[d3][d2][d1]; 
constexpr carr3d_t arr2 = { 
    { {1,2}, {3,4}, {5,6} }, 
    { {1,2}, {3,4}, {5,6} }, 
    { {1,2}, {3,4}, {5,6} }, 
    { {1,2}, {3,4}, {5,6} } 
}; 

हालांकि, एक इस तरह के एक ब्रेसिज़ के केवल जोड़ी के साथ सभी ब्रेसिज़ व्यापार प्राप्त कर सकते हैं:स्टैक्ड std :: array का उपयोग करके बहु-आयामी सरणी की घोषणा में "डबल ब्रेसिज़" की आवश्यकता क्यों है?

// getaway with one-dimensional declaration 
constexpr arr3d_t arr3 = { 
    1,2, 3,4, 5,6, 
    1,2, 3,4, 5,6, 
    1,2, 3,4, 5,6, 
    1,2, 3,4, 5,6 
}; 
constexpr carr3d_t arr4 = { 
    1,2, 3,4, 5,6, 
    1,2, 3,4, 5,6, 
    1,2, 3,4, 5,6, 
    1,2, 3,4, 5,6 
}; 

मैं चाहूँगा जब खड़ी एसटीडी का उपयोग कर पता करने के लिए क्यों {{ न्यूनतम आयाम पर छोड़कर आवश्यक हैं :: सरणी?

godbolt.org/g/b6qfn4

उत्तर

3

आपका प्रकार arr_t, arr2d_t, arr3d_t और carr3d_t कुल प्रकार हैं। वे कुल प्रकार हैं क्योंकि std::array स्वयं एक समग्र प्रकार है। उनकी वस्तुओं को aggregate initialization का उपयोग करके प्रारंभ किया गया है और सी ++ 11 समर्थन के साथ संकलित करते समय आपको नेस्टेड प्रारंभकर्ता (ओं) के आस-पास (अतिरिक्त) {} ब्रेसिज़ की आवश्यकता होती है। (लोप)

नेस्टेड प्रारंभकर्ता सूचियों के आसपास ब्रेसिज़ elided किया जा सकता है

+0

मैं क्लैंग और जीसीसी दोनों की कोशिश करता हूं, यह संकलित नहीं करता है। इसका मतलब है कि वे सभी std :: सरणी केस के लिए अभी तक C++ 14 ब्रेस elision का चयन नहीं करते हैं? [Godbolt.org/g/YWAbHo](https://gcc.godbolt.org/g/YWAbHo) – sandthorn

6

बाहरी ब्रेसिज़ aggregate initializer syntax हैं और मन की सरणी प्रारंभकर्ता वाक्य रचना कर रहे हैं: सी ++ 14 मानक के साथ शुरू।

सी ++ 14 ब्रेस एलिजन की अनुमति देता है। सुनिश्चित करें कि आप सी ++ 14 या बेहतर के साथ संकलित कर रहे हैं।

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