char hello[] = "hello world";
std::string str;
str.resize(sizeof(hello)-1);
memcpy(&str[0], hello, sizeof(hello)-1);
このコードは、C++ 98では未定義の動作です。 C++ 11では合法ですか?
はい、_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)
ifpos < size()
。それ以外の場合は、タイプcharT
のオブジェクトへの参照を値charT()
で返します。オブジェクトを変更すると、未定義の動作が発生します。
あなたの例は上記の要件を満たすので、動作は明確に定義されています。