std :: string()与std :: string(“”)相同

时间:2014-11-11 13:51:26

标签: c++ c++11

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

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

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

4 个答案:

答案 0 :(得分:6)

std::string上肯定没有会员功能可以让您区分std::string()std::string("")

我尊重哲学家或逻辑学家来验证它是否满足任何相等的定义。

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

在我的特定STL实现(MSVC2012)上,std::string()调用名为_Tidy的函数,而std::string("")调用_Tidyassign。 (基类初始化是相同的)。 assign是标准std::string函数。

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

答案 1 :(得分:4)

如果我们看一下C ++标准中每个构造函数的效果,请参见§21.4.2[string.cons]:

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

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

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

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

严格地说,这两种结构不相同:特别是,构造的std::string对象的容量可能不同。

在实践中,这种可能的差异不太可能对您的代码产生任何可观察到的影响。

答案 2 :(得分:3)

是的,它们都是一样的。 std::string的{​​{3}}准备与""

相同的空字符串
  

显式basic_string(const Allocator& alloc = Allocator());
  默认构造函数。构造空字符串(零大小和   未指明的容量)   

  basic_string(const CharT * s,const Allocator& alloc = Allocator());
  构造字符串,其内容使用s指向的以null结尾的字符串的副本进行初始化。字符串的长度由第一个空字符决定。如果s不指向CharT的至少Traits :: length(s)+1元素的数组,则行为是未定义的。

答案 3 :(得分:2)

唯一的区别是std::string()在编译时知道它将产生零长度字符串,而std::string("")必须使用strlen或类似的东西来确定长度它将在运行时构造的字符串。因此默认构造函数应该更快。