1

正如标题所说:

如果新大小与旧大小相同,标准是否保证 std::string::resize 不会做任何事情?

当然,我可以测试它,但它可能是UB,所以测试不会在这里工作。
在 cppreference.com 和 cplusplus.com 中,文档对这个案例只字未提

例子:

std::string s( "asd" );
// s.size() is 3
s.resize( 3 );    // will this affect **somehow** the string?
4

2 回答 2

4

不,没有任何保证。实现可以将字符串重新分配到新缓冲区,以减少其capacity().

标准说:

效果:改变指定字符串的长度,*this如下所示:

— 如果n <= size(),该函数用*this长度为 n 的字符串替换由 指定的字符串,其元素是由 指定的原始字符串的初始元素的副本*this

— 如果n > size(),该函数用*this长度为 n 的字符串替换由 指定的字符串,该字符串的第一个size()元素是由 指定的原始字符串的副本,*this其余元素全部初始化为 c。

于 2012-07-09T11:01:53.820 回答
1

ISO/IEC 14882:2011(E) § 21.4.4:

void resize(size_type n, charT c);

要求: n <= max_size()

抛出:如果 n > max_size(),则为 length_error。

效果:改变 *this 指定的字符串的长度,如下所示:

  • 如果 n <= size(),该函数将 *this 指定的字符串替换为长度为 n 的字符串,其元素是 *this 指定的原始字符串的初始元素的副本。
  • 如果 n > size(),函数将 *this 指定的字符串替换为长度为 n 的字符串,其第一个 size() 元素是 *this 指定的原始字符串的副本,其余元素全部初始化为 c。
于 2012-07-09T11:03:52.673 回答