使用 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))
阅读更多:
我必须处理来自 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))
阅读更多: