【发布时间】:2019-06-19 07:23:25
【问题描述】:
我试图了解隐式转换何时发生并检测它们以提高我的代码库的质量。
我为此启用了Wconversion 和Wsign-conversion。但是我遇到了编译器没有给出任何错误的情况。示例:
#include <iostream>
#include <array>
int main()
{
std::array<int, 10> vec{};
std::cout << vec[1] << std::endl;
}
编译:
$ g++ --std=c++14 -Wall -Wextra -Werror -pedantic -Wsign-conversion -Wconversion test.cpp
$
数组的大小和operator[] 的索引都应该是std::size_t 类型(无符号)。但是我正在传递签名文字,似乎没有问题。我什至可以将1.0F 传递给operator[],编译器就可以了。
如果我为operator[] 的索引创建一个有符号变量,那么编译器会警告隐式转换。
幕后发生了什么?使用文字时是否会发生隐式转换?为什么编译器不报错?我在 Ubuntu 18.04 上使用 GCC 7.4。
【问题讨论】:
-
您不会收到警告,因为编译器在编译时就知道这些转换没问题,如果您使用编译时不知道的东西,您将按预期收到警告。