web-dev-qa-db-ja.com

&str [0]バッファー(std:stringの)への書き込みは、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では合法ですか?

28
cubuspl42

はい、_std::string_のストレージは連続していることが保証されており、コードは終了NULL文字(または初期化されたCharT)の上書きを回避するため、コードはC++ 11で有効です。

N3337から§21.4.5[string.access]

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

1必要:pos <= size()
2戻り値:*(begin() + pos) if pos < size()。それ以外の場合は、タイプcharTのオブジェクトへの参照を値charT()で返します。オブジェクトを変更すると、未定義の動作が発生します。

あなたの例は上記の要件を満たすので、動作は明確に定義されています。

27
Praetorian