警告C++隐式转换

Pav*_*nov 5 c++ implicit-conversion

我有这个C++代码:

#include <iostream>
#include <vector>
#include <numeric>

using namespace std;

int main() {
  vector<int64_t> vec = {4294967296, 4294967296, 4294967296};
  int64_t sum = accumulate(vec.begin(), vec.end(), 0, [](int64_t sum, int64_t val){
    return sum + val;
  });
  cout << "sum = " << sum << endl;
}
Run Code Online (Sandbox Code Playgroud)

它返回sum = 0是因为隐式转换intint64(参见函数的0第三个参数accumulate).更换0后的(int64_t)0一切工作正常.

但是我可以在编译时检测到这些东西吗?-Wconversion在这种情况下不起作用.

Oli*_*liv 5

如果代码std::accumulate不在系统头文件中,您将收到警告:

int init=0;
init += *vec.begin() //warning: conversion from 'int64_t' {aka 'long int'} to 'int' may change value [-Wconversion]
Run Code Online (Sandbox Code Playgroud)

但是对于系统头文件禁用了许多警告,因为这样的警告会导致许多嘈杂和无关的消息.

这种行为可以再现.假设你有这个文件test.hpp:

int64_t i;
int j = i;
Run Code Online (Sandbox Code Playgroud)

如果您test.cpp在包含此文件的同一目录中编译文件:

  • c++ -I . test.cpp -Wconversion,打印警告信息;
  • c++ -isystem . test.cpp -Wconversion警告信息不打印!

这正是标准库的头文件发生的情况,默认情况下指定include目录-isystem.

可以使用选项禁用系统标头警告消息抑制 -Wsystem-header

演示

演示中可以看到警告消息隐藏在一堆或不相关的警告消息中.