假设我有一个返回a的函数std::string.某些情况意味着字符串没有填充任何内容.
返回std::string()完全等同于std::string("")?例如,将c_str()或data()给你同样的字符序列?也许std::string("")调用一个简短的字符串优化,但std::string()在添加一些字符之前不会这样做.
有谁知道当前的标准(C++ 11)是否说明了什么?
当然没有成员函数std::string可以让你区分a std::string()和a std::string("").
我推荐一位哲学家或逻辑学家来验证它是否满足任何平等定义.
至于标准本身,它表示std::string()将保留容量未指定但std::string("")将定义至少为零的容量.所以对象的内部状态可能不同.
在我特定的STL实现(MSVC2012)上,std::string()调用一个调用的函数,_Tidy而std::string("")调用_Tidy和assign.(基类初始化是相同的).assign是一个标准std::string功能.
他们可能会有所不同吗?是的.你能说出他们是不同的吗?不.
如果我们看看 C++ 标准中 \xc2\xa7 21.4.2 [string.cons] 节中每个构造函数的效果:
\n\n为了explicit basic_string(const Allocator& a = Allocator()):
\n\n\n\n
\n- \n
data(): 一个非空指针,可复制并且可以添加 0- \n
size(): 0- \n
capacity():未指定的值
为了basic_string(const charT* s, const Allocator& a = Allocator()):
\n\n\n\n
\n- \n
data():指向数组的已分配副本的第一个元素,该数组的第一个元素由 s 指向- \n
size():traits::length(s)- \n
capacity():至少与 size() 一样大的值
因此严格来说,两种构造并不相同:特别是构造std::string对象的容量可能不同。
实际上,这种可能的差异不太可能对您的代码产生任何明显的影响。
\n