我有一个返回指针和长度的函数,我想调用std::string::assign(pointer, length)
。当length为零并且指针可能为nullptr时,是否需要做一个特殊情况(调用clear
)?
C++标准说:
21.4.6.3 basic_string::assign
basic_string& assign(const charT* s, size_type n);
Requires: s points to an array of at least n elements of charT.
那么,如果
n
为零呢?什么是零字符数组,怎么指向它?打电话有效吗
s.assign(nullptr, 0);
还是未定义的行为?
当
s
的大小为零时,libstdc++的实现似乎并未取消对指针n
的引用,但这几乎不能保证。 最佳答案
徒劳地,nullptr
不满足指向大小为>=0
的数组的要求,因此该标准不能保证其行为(它是UB)。
另一方面,如果n
为零,则不允许实现取消对指针的引用,因为该指针可能是大小为零的数组,而取消引用此类指针将具有未定义的行为。此外,不需要这样做,因为不会复制任何内容。
以上推理并不意味着可以忽略UB。但是,如果没有理由禁止s.assign(nullptr, 0)
,则最好将标准的措词更改为“如果n大于零,则s指向...”。我不知道有任何理由禁止这样做,但我也不能保证不存在任何理由。
请注意,添加支票几乎并不复杂:
s.assign(ptr ? ptr : "", n);
这是:
new char[0]
。自动或静态存储阵列的大小不能为零。关于c++ - 将nullptr传递给std::string::assign是否有效?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/34901903/