【问题标题】:Is it right to use static_cast<void> to ignore iterator as return value? [duplicate]使用 static_cast<void> 忽略迭代器作为返回值是否正确? [复制]
【发布时间】:2021-02-22 01:57:23
【问题描述】:

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

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 上已搜索的问题不感兴趣的特定问题。

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

【问题讨论】:

  • 这里的问题是,如果你不使用temp,你就没有正确地从你的字符串中删除空格。
  • 如果您收到有关丢弃返回值的警告,这应该被解释为您的代码有问题的迹象,不是您应该找到一种方法使警告静音。
  • @john 我再次在 stringVar 上搜索第一次出现的分隔符。所以,我对返回迭代器指向的垃圾不感兴趣
  • 这类似于“我的汽车的检查引擎灯亮着,我该如何取下灯泡?”
  • 请注意,输入如" ",允许输出为“hello”。 std::partition 似乎更合适。

标签: c++ c++17 compiler-warnings nodiscard


【解决方案1】:

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

正确的代码是

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

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

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

【讨论】:

  • 我不想使用擦除删除成语。我对返回值不感兴趣。
  • @BuildSucceeded 确认一下,您希望“已移除”的元素在容器的末端徘徊吗?
  • @BuildSucceeded 将std::remove 用于删除项目以外的其他目的是一件很奇怪的事情,也许您应该在问题中说明这一点。否则几乎每个人都会认为你只是一个初学者犯了初学者的错误。所以你只是对std::remove 执行的重排感兴趣?什么原因?
  • @user4581301 我对这些没意见,因为我要进行一些搜索,而这些搜索不会去那些
  • 对不起@john 或令人困惑的问题,但我强调处理警告。我会改进问题
【解决方案2】:

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


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

static_cast < void >

如果你想使用宏

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

阅读更多:How can I intentionally discard a no-discard return value?

【讨论】:

    猜你喜欢
    • 2015-04-26
    • 2010-12-19
    • 1970-01-01
    • 2015-12-30
    • 1970-01-01
    • 1970-01-01
    • 2021-02-03
    • 2012-02-04
    • 2013-09-23
    相关资源
    最近更新 更多