2014-10-30 9 views
6

मैं C++ 11 की नई विशेषताओं को आजमा रहा हूं और मुझे कोई समस्या मिली। यह मेरा कोड है:सूची विधि पर g ++ 4.8.2 पर त्रुटि-तर्क डिफ़ॉल्ट प्रारंभिक

#include <iostream> 
#include <list> 
#include <string> 

using namespace std; 

class A { 
public: 
     int f (list<string> a, list<string> b={}) 
     { 
      cout << a.size() << endl; 
      cout << b.size() << endl; // This line!!! 
      return 0; 
     } 
}; 

int main() 
{ 
    A a; 
    list<string> l{"hello","world"}; 
    a.f(l); 
    return 0; 
} 

निष्पादन "यह रेखा !!!" पर फंस गया लाइन। मैं डीबगिंग जारी रखता हूं और ऐसा लगता है कि समस्या यहां है। पहले से

g++ (Ubuntu 4.8.2-19ubuntu1) 4.8.2 

धन्यवाद !!!:

 /** Returns the number of elements in the %list. */ 
     size_type 
     size() const _GLIBCXX_NOEXCEPT 
     { return std::distance(begin(), end()); } 

मैं इस तरह से मेरा कार्यक्रम संकलन:

g++ -std=c++11 -ggdb3 -fPIC -o test TestlistInit.cpp 

मैं जी ++ के इस संस्करण का उपयोग कर रहा

+3

मुझे 4.7.3 पर एक ही समस्या मिलती है, दिलचस्प रूप से 'सूची बी = सूची () 'कार्यों को बदलती है। लेकिन हाँ, एक जीसीसी बग की तरह लगता है। – Barry

+2

निश्चित रूप से एक बग। आपको एक [सेगमेंटेशन गलती] मिलती है (http://coliru.stacked-crooked.com/a/b1764458721a56fc) जब आप इसे फ़ंक्शन से डिफ़ॉल्ट तर्क के रूप में वापस करते हैं। और देखें कि क्या होता है [जब सूची में तत्व होते हैं।] (Http://coliru.stacked-crooked.com/a/fa7a009908546074) – 0x499602D2

+0

अविश्वसनीय है कि ऐसी प्राथमिक बग अभी भी 4.8.2 में हैं ... – Walter

उत्तर

2

कारण ढूंढने के लिए, डीबग प्रतीकों को सक्षम करने के लिए, और जब आप पहली पंक्ति में जाते हैं, तो हम पहले बी की सामग्री की जांच करते हैं, जो इस तरह दिखता है (मान अलग होगा) इस मामले में मैंने कोड :: ब्लॉक "वॉच "विकल्प।

b.M_Impl._M_node._M_next = 0x7fffffffe370 
b.M_Impl._M_node._M_prev = 0x7fffffffe370 

फिर हमारे b.size लाइन को हिट करने के बाद "चरणबद्ध" करने के लिए डीबगर विकल्प का उपयोग करें।

अंततः इस

stl_iterator_base_funcs.h को शुरू में हमें ले हम पहले & देख सकते हैं जाएगा पिछले ही कर रहे हैं:

__first._M_node = 0x7fffffffe370 
__last._M_node = 0x7fffffffe370 

while (__first != __last) 
{ 
    ++__first; 
    ++__n; 
} 

++__first में कदम हम देख सकते हैं यह stl_list.h में यह करता है:

_Self& 
operator++() 
{ 
_M_node = _M_node->_M_next; 
return *this; 
} 

_M_node और और _M_node->_M_next ही कर रहे हैं, तो __first n कभी वृद्धि, और .size() अंतहीन पाश में पकड़ा जाता है।

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