gpt4 book ai didi

c++ - 传递整数文字时没有隐式转换警告?

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:01:40 26 4
gpt4 key购买 nike

我试图了解隐式转换何时发生并检测它们以提高我的代码库的质量。

我为此启用了WconversionWsign-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。

最佳答案

编译器不会警告您,因为它在编译时知道此转换安全,即原始值和目标值相同。当你这样做时:

vec[1.0F]

从编译器的角度来看,1.0F 之间没有值的变化(精度损失)。和 1 ,所以编译器不会警告你。如果您尝试:

vec[1.2F]

...编译器会警告你,因为尽管 1.2F将转换为 1 , 存在精度损失。

如果您使用编译时未知的值,例如:

float get_float();

vec[get_float()];

您将收到预期的警告,因为编译器不知道 get_float() 的值事先进行,因此无法确定转换安全

请注意,当需要常量表达式时(例如,在 std::array<int, 10> 中),您永远不会收到此类警告,因为根据定义,常量表达式在编译时是已知的,因此编译器知道给定的表达式之间是否存在问题值和转换后的值。

关于c++ - 传递整数文字时没有隐式转换警告?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56662187/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com