我有一个返回指针和长度的函数,我想调用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/

10-13 08:13