在std :: wstring上使用std :: remove_if的警告MSVC C ++ 20

问题描述

当使用winapi HWND并返回wstring时,我有一个函数

onSubmit(e){
    let yourIncorrectAnswers = Object.values(this.state.incorrect_answers);
  })
    

}

,我收到以下错误消息:

std::wstring utility::winapi::window_class(HWND hwnd) {
    int title_length = 20;
    std::wstring class_name;
    class_name.resize(title_length,'\0');
    GetClassName(hwnd,const_cast<LPWSTR>(class_name.c_str()),title_length);
    class_name.erase(std::remove_if(class_name.begin(),class_name.end(),[](const char &x){return x == '\0';}),class_name.end());
    return class_name;
}

错误是什么意思?

UPD:更新时显示完整错误

解决方法

class_name被声明为std::wstring。这是一个wchar_t值的字符串,但是您的lambda参数的类型为const char &,它的范围更窄。警告告诉您该值可能会被截断。这可能会导致测试x == '\0'在应注意的情况下评估为真。这是编译器试图告诉您的:

warning C4244: 'argument': conversion from 'wchar_t' to 'const char',possible loss of data

作为旁注,没有理由通过引用接受数字参数。在这种情况下,很可能会导致组装相同,因为几乎可以肯定会内联lambda,但不使用引用会更干净。

要解决此警告,请更改lambda以接受wchar_t

[](wchar_t x){return x == '\0';})

从C ++ 14开始,您还可以使用auto作为参数的类型:

[](auto x){return x == '\0';})