http://gcc.gnu.org/bugzilla/show_bug.cgi?id=48257
Mohsin <mohsinrzaidi at gmail dot com> changed: What |Removed |Added ---------------------------------------------------------------------------- Status|RESOLVED |UNCONFIRMED Resolution|INVALID | --- Comment #4 from Mohsin <mohsinrzaidi at gmail dot com> 2011-03-24 06:19:52 UTC --- (In reply to comment #3) > In C++03 see 21.3.5.3 [lib.string.assign] paragraph 6 where > string::assign(const char* s, size_t n) is defined to return > assign( string(s, n) ) and that constructor: > > Constructs an object of class basic_string and determines its initial string > value from the array of charT of length n whose first element is designated by > s, > > In C++0x the requirement is explicit, [string::assign] paragraph 8 says > > Requires: s points to an array of at least n elements of charT. I believe this is what you were referring to (from N3242=11-0012): basic_string& assign(const charT* s, size_type n); 8 Requires: s points to an array of at least n elements of charT. 9 Throws: length_error if n > max_size(). 10 Effects: Replaces the string controlled by *this with a string of length n whose elements are a copy of those pointed to by s. 11 Returns: *this. Thanks for pointing this out. However, does libstdc++ throw and error if "n > max_size()"? I don't think it does. >From the latest libstdc++ documentation: <snip> template<typename _CharT, typename _Traits , typename _Alloc > basic_string< _CharT, _Traits, _Alloc > & std::basic_string< _CharT, _Traits, _Alloc >::assign ( const _CharT * __s, size_type __n ) Set value to a C substring. Parameters: s The C string to use. n Number of characters to use. Returns: Reference to this string. This function sets the value of this string to the first n characters of s. If n is is larger than the number of available characters in s, the remainder of s is used. Definition at line 261 of file basic_string.tcc. References std::basic_string< _CharT, _Traits, _Alloc >::size(). </snip> I don't see this as saying that the string has to have at least n elements OR that an error will be thrown if it isn't. >From the latest basic_string code: <snip> template<typename _CharT, typename _Traits, typename _Alloc> 00259 basic_string<_CharT, _Traits, _Alloc>& 00260 basic_string<_CharT, _Traits, _Alloc>:: 00261 assign(const _CharT* __s, size_type __n) 00262 { 00263 __glibcxx_requires_string_len(__s, __n); 00264 _M_check_length(this->size(), __n, "basic_string::assign"); 00265 if (_M_disjunct(__s) || _M_rep()->_M_is_shared()) 00266 return _M_replace_safe(size_type(0), this->size(), __s, __n); 00267 else 00268 { 00269 // Work in-place. 00270 const size_type __pos = __s - _M_data(); 00271 if (__pos >= __n) 00272 _M_copy(_M_data(), __s, __n); 00273 else if (__pos) 00274 _M_move(_M_data(), __s, __n); 00275 _M_rep()->_M_set_length_and_sharable(__n); 00276 return *this; 00277 } 00278 } </snip> I don't see any errors being thrown. I am not trying to nit-pick but I've raised this issue because I was affected by it and had to spend several days isolating it. It would have made my life a whole lot easier if, as you claim, libstdc++ had thrown an error. Just a request, but please let the discussion complete before you go ahead and mark the bug as Resolved-Invalid. I don't mind it being marked invalid, but I consider it disrespectful for you to not even wait for my response and rushing to mark it as invalid. Once we're through discussing, I will mark it invalid myself if necessary.