2

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

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

我想要正确的方法来做到这一点。可以通过以下代码停止警告:

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

我不想使用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(), stringVar.end(), ' '));

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

输出:

In

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

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

4

2 回答 2

3

这里的问题是,如果你不使用temp你没有正确地从你的字符串中删除空格。

正确的代码是

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

您会看到std::remove不会从任何东西中删除任何东西(当它只有两个迭代器时,它怎么可能?)。它所做的只是重新排列字符串,以便字符串末尾的项目是应该删除的字符串部分(您可以将其视为将所有空格移动到字符串末尾,但实际上它比那)。

要真正擦除,您需要调用string::erase,使用返回的迭代器,std::remove如上面的代码所示。

于 2020-11-10T06:06:45.437 回答
0

正如@john 所指出的,如果您丢弃该值,该操作将不起作用。这就是说明符的全部意义,[[nodiscard]]它是为了防止用户忽略它的值。


如果您有充分的理由忽略警告,那么您已经建议的方法是执行此操作的最佳方法。将其转换为void.

static_cast < void >

如果你想使用宏

#define ignore(x) (static_cast < void > (x))

阅读更多:我怎样才能故意丢弃一个不丢弃的返回值?

于 2020-11-10T06:30:55.003 回答