简体   繁体   中英

Is writing to &str[0] buffer (of a std:string) well-defined behaviour in C++11?

char hello[] = "hello world";
std::string str;
str.resize(sizeof(hello)-1);
memcpy(&str[0], hello, sizeof(hello)-1);

This code is undefined behaviour in C++98. Is it legal in C++11?

Yes, the code is legal in C++11 because the storage for std::string is guaranteed to be contiguous and your code avoids overwriting the terminating NULL character (or value initialized CharT ).

From N3337, §21.4.5 [string.access]

  const_reference operator[](size_type pos) const; reference operator[](size_type pos); 

1 Requires: pos <= size() .
2 Returns: *(begin() + pos) if pos < size() . Otherwise, returns a reference to an object of type charT with value charT() , where modifying the object leads to undefined behavior.

Your example satisfies the requirements stated above, so the behavior is well defined.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM