2010-11-28 37 views
17

पर विचार करें निम्नलिखित कोड:सी ++ 11 वेक्टर push_back अस्पष्ट

#include <vector> 

struct S { int a; double b; }; 

int main() 
{ 
    std::vector<S> v; 
    v.push_back({3, 4.5}); 
} 

जी ++ 4.4 शिकायत है कि कॉल करने के लिए push_back() अस्पष्ट है:

error: call of overloaded ‘push_back(<brace-enclosed initializer list>)’ is ambiguous 
note: candidates are: void std::vector<_Tp, _Alloc>::push_back(const _Tp&) [with _Tp = S, _Alloc = std::allocator<S>] 
note:     void std::vector<_Tp, _Alloc>::push_back(_Tp&&) [with _Tp = S, _Alloc = std::allocator<S>] 

इस के अनुसार अस्पष्ट माना जाता है मानक, या यह सिर्फ g ++ के साथ एक मुद्दा है?

मैं जानता हूँ कि यह एस के प्रकार स्पष्ट रूप में लिख कर हल किया जा सकता:

v.push_back(S{3, 4.5}); 

लेकिन एस के प्रकार के नाम लंबा हो सकता है, इसलिए मैं नहीं बल्कि ऐसा नहीं होगी ...

+0

मैं अनुमान लगा रहा हूं कि आपके कंपाइलर में सभी नए रावल्यू संदर्भ (चाल या &&) कार्यान्वयन पूर्ण नहीं हैं और एक नियम सेट है कि किस अस्थायी के लिए उपयोग करना पसंद करते हैं (चलने योग्य एक लेना चाहिए क्योंकि आपकी ऑब्जेक्ट अस्थायी है) – David

उत्तर

4

सबसे हालिया मसौदे (एन 3225) के साथ, आपका कोड वास्तव में संदिग्ध है। उम्मीदवारों कि वेक्टर में हैं

void push_back(const S& x); 
void push_back(S&& x); 

हो जाएगा सवाल है: एक const S& एक बेहतर/बदतर रूपांतरण अनुक्रम एक S&& की एक सूची-प्रारंभ से की सूची-प्रारंभ है? ओवरलोड रिज़ॉल्यूशन दोनों रूपांतरणों को उपयोगकर्ता परिभाषित रूपांतरण अनुक्रम बना देगा। इसका मतलब है कि वे तुलनात्मक नहीं हैं क्योंकि ऐसा कोई नियम नहीं है जो ऐसा कर सकता है।

यह core issue #1079 द्वारा संभाला जाता है। यदि वह मुद्दा स्वीकार हो जाता है, तो इरादा यह है कि आपका कोड दूसरे उम्मीदवार को कॉल करता है। संयोग से, जेसन मेरिल एक जीसीसी डेवलपर है :)

6

S एक पीओडी होना है? यदि नहीं, तो एक कन्स्ट्रक्टर को परिभाषित करें, और इसे काम करना चाहिए।

struct S 
{ 
    int a; 
    double b; 

public: 

    S(int a, double b) : a(a), b(b) {} 
}; 

इसके अलावा, v.push_back({3, 4.5}) शायद v.emplace_back(3, 4.5) की तुलना में कम कुशल है।


अद्यतन: एक संकलक बग की तरह खुशबू। यह g ++ 4.6.0 20101025 (प्रयोगात्मक) के साथ पूरी तरह से अच्छी तरह से काम करता है।

+3

उपयोगी होने पर, वास्तव में ओपी की क्या मांग नहीं है? मैं भी उत्सुक हूं कि वहां क्या होता है - क्यों एक संस्करण एक लालसा/रावल्यू होने के बारे में अस्पष्ट है और दूसरा नहीं है, जबकि वे दोनों, ठीक है, अस्थायी हैं। – Kos

+2

@ कोस: अस्थायी विभिन्न प्रकार के हैं। '{3, 4.5}' एक 'std :: startizer_list ' है, जबकि 'एस {3, 4.5}' एक 'एस' है। शायद इसे इस तथ्य से क्या करना है कि 'ए' एक 'int' है और 'डबल' नहीं है? ईमानदारी से, मुझे नहीं पता। – fredoverflow

+0

दिलचस्प, मुझे emplace_back के बारे में पता नहीं था। हालांकि, ऐसा लगता है कि एस – HighCommander4

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