https://gcc.gnu.org/bugzilla/show_bug.cgi?id=69092
Jonathan Wakely <redi at gcc dot gnu.org> changed: What |Removed |Added ---------------------------------------------------------------------------- Known to work| |4.8.3 Summary|basic_string constructor |[4.9/5/6 Regression] |and throwing iterators |basic_string constructor | |and throwing iterators Known to fail| |4.9.3, 5.3.0, 6.0 --- Comment #3 from Jonathan Wakely <redi at gcc dot gnu.org> --- This worked OK in 4.8, and still works OK in C++03 mode (if tweaked to remove the C++11 features): #include<string> #include<iterator> struct hate_T_iterator : std::iterator<std::forward_iterator_tag, char> { explicit hate_T_iterator(char* p) : p(p) {} char* p; hate_T_iterator& operator++() { ++p; return *this; } hate_T_iterator operator++(int) { hate_T_iterator r = *this; ++*this; return r; } char& operator*() const { if(*p == 'T') throw 1; else return *p; } char* operator->() const { return p; } bool operator== (hate_T_iterator other) const { return p == other.p;} bool operator!= (hate_T_iterator other) const { return p != other.p;} }; int main(){ char test_str[4] = "ATA"; try { std::string s(hate_T_iterator(test_str), hate_T_iterator(test_str+3)); } catch(...) { } }