char hello[] = "hello world";
std::string str;
str.resize(sizeof(hello)-1);
memcpy(&str[0], hello, sizeof(hello)-1);
这段代码在C++98中是未定义的行为。在C++11中它是否合法?
char hello[] = "hello world";
std::string str;
str.resize(sizeof(hello)-1);
memcpy(&str[0], hello, sizeof(hello)-1);
这段代码在C++98中是未定义的行为。在C++11中它是否合法?
是的,这段代码在C++11中是合法的,因为std::string
的存储被保证是连续的,并且您的代码避免了覆盖终止的NULL字符(或值初始化的CharT
)。
来自N3337,《§21.4.5 [string.access]》
const_reference operator[](size_type pos) const; reference operator[](size_type pos);
1 需求:
pos <= size()
。2 返回:如果
pos < size()
,则返回*(begin() + pos)
。否则,返回一个类型为charT
值为charT()
的对象的引用,修改该对象会导致未定义的行为。您的示例满足上述要求,因此行为是良好定义的。
char
的副本的引用,只要对它(以及它本身)的读写操作符合预期即可? - BCSdata()
成员函数的描述。通过这两个部分,就可以清楚地了解符合规范的实现需要具有连续的存储,并且 operator[]
返回对此存储中元素的引用。 - Praetorian
std::string
的新保证是其缓冲区连续存储。但我不确定标准是否允许写入该缓冲区,因为据我所知,std::string
的COW实现仍然有可能存在。 - cubuspl42string str; str.resize(8); fread(&str[0], 1, str.size(), file);
。 - cubuspl42