2015-03-19 10 views
11

क्या यह संभव है?एक arrayizer_list के साथ सरणी शुरू करना?

#include <array> 
#include <initializer_list> 

struct A 
{ 
    A (std::initializer_list<int> l) 
     : m_a (l) 
    { 
    } 

    std::array<int,2> m_a; 
}; 

int main() 
{ 
    A a{ 1,2 }; 
} 

लेकिन यह इस त्रुटि में परिणाम है:

t.cpp: In constructor ‘A::A(std::initializer_list<int>)’: 
t.cpp:7:19: error: no matching function for call to ‘std::array<int, 2ul>::array(std::initializer_list<int>&)’ 
     : m_a (l) 
       ^
t.cpp:7:19: note: candidates are: 
In file included from t.cpp:1:0: 
/usr/lib/gcc/x86_64-pc-linux-gnu/4.8.2/include/g++-v4/array:81:12: note: std::array<int, 2ul>::array() 
    struct array 
      ^
/usr/lib/gcc/x86_64-pc-linux-gnu/4.8.2/include/g++-v4/array:81:12: note: candidate expects 0 arguments, 1 provided 
/usr/lib/gcc/x86_64-pc-linux-gnu/4.8.2/include/g++-v4/array:81:12: note: constexpr std::array<int, 2ul>::array(const std::array<int, 2ul>&) 
/usr/lib/gcc/x86_64-pc-linux-gnu/4.8.2/include/g++-v4/array:81:12: note: no known conversion for argument 1 from ‘std::initializer_list<int>’ to ‘const std::array<int, 2ul>&’ 
/usr/lib/gcc/x86_64-pc-linux-gnu/4.8.2/include/g++-v4/array:81:12: note: constexpr std::array<int, 2ul>::array(std::array<int, 2ul>&&) 
/usr/lib/gcc/x86_64-pc-linux-gnu/4.8.2/include/g++-v4/array:81:12: note: no known conversion for argument 1 from ‘std::initializer_list<int>’ to ‘std::array<int, 2ul>&&’ 
+0

यह संभव नहीं है, एक वर्कअराउंड के रूप में, मैन्युअल रूप से 'प्रारंभकर्ता_सूची' के तत्वों की प्रतिलिपि बनाएँ: 'ए (std ::itializer_list l)/* m_a */{std :: copy (l। शुरू करें(), l.end(), m_a.begin());} ' – Mankarse

+0

ध्यान दें कि यह रचनाकारों के लिए विशेष नहीं है; 'std :: startizer_list x = {1, 2} के साथ एक ही समस्या उत्पन्न होती है; std :: array मीटर {?????? }; '। आप केवल यहां चीजें डाल सकते हैं जो समग्र प्रारंभिकरण का हिस्सा हैं, यानी प्रत्येक तत्व के लिए एक-एक करके प्रारंभकर्ता। –

+0

http://stackoverflow.com/q/5549524/1436796 देखें जो एक संभावित समाधान भी प्रदान करता है, भले ही सदस्य सरणी को 'const'' योग्यता प्राप्त होनी चाहिए (जो इसे खाली छोड़ने और बाद में सूची सामग्री को कॉपी करने के लिए अक्षम करता है)। –

उत्तर

15

नहीं इस मामले में। आप एक सूची-प्रारंभकर्ता

std::array<int, 2> a{1,2}; 

साथ array प्रारंभ कर सकते हैं, लेकिन आप initializer_list साथ array प्रारंभ नहीं कर सकते हैं, के बाद से array केवल डिफ़ॉल्ट के साथ सिर्फ एक समग्र प्रकार है और निर्माता की प्रतिलिपि बनाएँ।

आप केवल सरणी खाली छोड़ सकते हैं और फिर initializer_list की सामग्री कॉपी कर सकते हैं।

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