使用 static_cast<void> 忽略迭代器作为 return 值是否正确?

Is it right to use static_cast<void> to ignore iterator as return value?

我必须处理来自 std::remove 的 [[nodiscard]] 警告;

static_cast<void>(std::remove(stringVar.begin(), stringVar.end(), ' '));

我想要正确的方法。可以通过以下代码停止警告:

auto temp = std::remove(stringVar.begin(), stringVar.end(), ' ');

我不想使用 std::remove 的 return 值。

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(), stringVar.end(), ' '));

    from = stringVar.find(delFrom, pos);
    to = stringVar.find(delTo, pos);
    std::cout<< stringVar.substr(from + 1, to - from - 1);
}

输出:

In

这是一个特定的问题,对已经在 SO 上搜索过的问题不感兴趣。

更新:数据格式一致且可读。

这里的问题是,如果您不使用 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))

阅读更多: