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是因为隐式转换int为int64(参见函数的0第三个参数accumulate).更换0后的(int64_t)0一切工作正常.
但是我可以在编译时检测到这些东西吗?-Wconversion在这种情况下不起作用.
如果代码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
在演示中可以看到警告消息隐藏在一堆或不相关的警告消息中.