std :: string()与std :: string("")相同

P45*_*ent 13 c++ c++11

假设我有一个返回a的函数std::string.某些情况意味着字符串没有填充任何内容.

返回std::string()完全等同于std::string("")?例如,将c_str()data()给你同样的字符序列?也许std::string("")调用一个简短的字符串优化,但std::string()在添加一些字符之前不会这样做.

有谁知道当前的标准(C++ 11)是否说明了什么?

Bat*_*eba 6

当然没有成员函数std::string可以让你区分a std::string()和a std::string("").

我推荐一位哲学家或逻辑学家来验证它是否满足任何平等定义.

至于标准本身,它表示std::string()将保留容量未指定但std::string("")将定义至少为零的容量.所以对象的内部状态可能不同.

在我特定的STL实现(MSVC2012)上,std::string()调用一个调用的函数,_Tidystd::string("")调用_Tidyassign.(基类初始化是相同的).assign是一个标准std::string功能.

他们可能会有所不同吗?是的.你能说出他们是不同的吗?.

  • @Bathsheba`std :: string :: size_type`是无符号的,所以它不能返回`-1`.并且"至少为零"意味着与"未指定"相同. (2认同)
  • ** - 1**"将保留未指定的容量,但std :: string("")将定义至少为零的容量.因此对象的内部状态可能不同." 很傻.容量始终为零或更大. (2认同)

qua*_*dev 4

如果我们看看 C++ 标准中 \xc2\xa7 21.4.2 [string.cons] 节中每个构造函数的效果:

\n\n

为了explicit basic_string(const Allocator& a = Allocator())

\n\n
\n
    \n
  • data(): 一个非空指针,可复制并且可以添加 0
  • \n
  • size(): 0
  • \n
  • capacity():未指定的值
  • \n
\n
\n\n

为了basic_string(const charT* s, const Allocator& a = Allocator())

\n\n
\n
    \n
  • data():指向数组的已分配副本的第一个元素,该数组的第一个元素由 s 指向
  • \n
  • size():traits::length(s)
  • \n
  • capacity():至少与 size() 一样大的值
  • \n
\n
\n\n
\n\n

因此严格来说,两种构造并不相同:特别是构造std::string对象的容量可能不同。

\n\n

实际上,这种可能的差异不太可能对您的代码产生任何明显的影响。

\n

  • 根据相同的论点,“std::string{}”和“std::string{}”并不相同。 (4认同)
  • **-1** 不相同的结论是愚蠢的。保证的行为是相同的。非保证行为(例如容量)的自由度是相同的。 (3认同)