如何解决使用static_cast <void>忽略迭代器作为返回值是否正确?
我必须处理来自std::remove
的[[nodiscard]]警告;
static_cast<void>(std::remove(stringVar.begin(),stringVar.end(),' '));
auto temp = std::remove(stringVar.begin(),' ');
我不想使用std::remove
的返回值。
void main()
{
std::string stringVar { "Operation : In,Value : 3884," };
size_t from = 0,to = 0,pos = 0;
std::string delFrom{ ":" },delTo{ "," };
static_cast<void>(std::remove(stringVar.begin(),' '));
from = stringVar.find(delFrom,pos);
to = stringVar.find(delTo,pos);
std::cout<< stringVar.substr(from + 1,to - from - 1);
}
输出:
In
更新:数据一致且可读的格式。
解决方法
这里的问题是,如果您不使用temp
,则不会正确删除字符串中的空格。
正确的代码是
auto temp = std::remove(stringVar.begin(),stringVar.end(),' ')
stringVar.erase(temp,stringVar.end());
您看到std::remove
不会从任何内容中删除任何内容(当它只有两个迭代器时怎么办?)。它所做的只是重新排列字符串,以使字符串末尾的项目成为应该擦除的字符串的一部分(您可以将其视为将所有空格都移到字符串末尾,但实际上比)。
要真正擦除,您需要使用string::erase
返回的迭代器来调用std::remove
,如上面的代码所示。
正如@john指出的那样,如果您放弃该值,则该操作将无效。这就是[[nodiscard]]
说明符的全部要点,该说明符防止防止用户忽略其值。
如果您有充分的理由忽略警告,那么您已经建议的方法是执行此操作的最佳方法。将其转换为void
。
static_cast < void >
如果您想使用宏
#define ignore(x) (static_cast < void > (x))
了解更多:How can I intentionally discard a no-discard return value?
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。