假设我有一个返回std::string
的函数。某些情况意味着字符串没有填充任何内容。
返回std::string()
完全等同于std::string("")
吗?例如,c_str()
或data()
会给你相同的字符序列吗?也许std::string("")
会调用一个简短的字符串优化,但std::string()
在添加一些字符之前不会这样做。
有谁知道当前的标准(C ++ 11)是否说明了什么?
答案 0 :(得分:6)
std::string
上肯定没有会员功能可以让您区分std::string()
和std::string("")
。
我尊重哲学家或逻辑学家来验证它是否满足任何相等的定义。
至于标准本身,它指出std::string()
将保留未指定的容量,但std::string("")
将定义至少为零的容量。因此,对象的内部状态可以不同。
在我的特定STL实现(MSVC2012)上,std::string()
调用名为_Tidy
的函数,而std::string("")
调用_Tidy
和assign
。 (基类初始化是相同的)。 assign
是标准std::string
函数。
他们可能会有所不同吗? 是即可。 你能说出他们是不同的吗? 否强>
答案 1 :(得分:4)
如果我们看一下C ++标准中每个构造函数的效果,请参见§21.4.2[string.cons]:
explicit basic_string(const Allocator& a = Allocator())
:
data()
:一个非空指针,可以复制,可以添加0size()
:0capacity()
:未指定的值
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
或类似的东西来确定长度它将在运行时构造的字符串。因此默认构造函数应该更快。