2014-10-30 10 views
6

C++ 11'in yeni özelliklerini deniyorum ve bir sorun buldum. Bu benim kodudur:hatası g ++ 4.8.2 'de listelenen metod-argümanı varsayılan başlatma

#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; 
} 

yürütme sıkışmış "Bu hat !!!" hat. Hata ayıklamaya devam ediyorum ve problem burada gibi görünüyor.

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

ben bu şekilde benim programı derlemek:

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

ben g ++ bu sürümünü kullanıyorum:

g++ (Ubuntu 4.8.2-19ubuntu1) 4.8.2 

sayesinde önceden !!!

+3

Aynı problemi 4.7.3'te de alıyorum, sadece listeyi değiştiriyorum b = liste () 'çalışır. Ama evet, bir gcc hatası gibi görünüyor. – Barry

+2

Kesinlikle bir hata. Bir varsayılan segman olarak bir işlevden döndürdüğünüzde [segmentation fault] (http://coliru.stacked-crooked.com/a/b1764458721a56fc) alırsınız. Ve bakalım ne [liste elemanlar içerdiğinde.] (Http://coliru.stacked-crooked.com/a/fa7a009908546074) – 0x499602D2

+0

bu tür temel hataların hala 4.8.2 ... – Walter

cevap

2

Nedeni bulmak için hata ayıklama simgelerini etkinleştirin ve ilk satıra gittiğinizde, önce b'nin içeriğini kontrol ederiz (bu değer farklı olacaktır). Bu durumda Code :: Blocks "Watch'ı kullanıyorum. "seçenek.

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

Sonra bizim b.size hattını çarptıktan sonra "adım" olarak ayıklayıcı seçeneğini kullanın.

Sonunda bu biz ilk & görebilirsiniz başında

stl_iterator_base_funcs.h götürecek son aynıdır:

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

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

++__first girerken her

biz stl_list.h içinde yapar görebilirsiniz:

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

_M_node ve ve _M_node->_M_next aynıdır, bu nedenle __first n sonsuz artışlar ve .size() sonsuz döngüde yakalanır.