gpt4 book ai didi

c++ - 自动类型推导没有按预期工作

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

这很像这个问题Why must a short be converted to an int before arithmetic operations in C and C++?然而,有一个子问题,为什么编译器在一种情况下诊断为警告,而在另一种情况下诊断为错误,表达式完全相同。

我真的很喜欢在 auto var =... 中使用 auto“类型”,但是 MSVC 2015 CTP 从我的代码中给出了一个错误。

问题是我正在auto-ing 类型short 的表达式,但有时它会被提升为int

这是一个 MCVE:

struct MY_COORD { short X; short Y; };
using t_crd = MY_COORD;

void call_test ( t_crd x ) {}

int main()
{
t_crd crd { 10 ,20 };

auto x5 = crd.X - crd.Y;
auto y5 = crd.Y - crd.X;
t_crd crd5 { x5 ,y5 }; // (1)
call_test( t_crd{ x5 ,y5 } ); // (2)
}

第(1)行和第(2)行的消息分别是:

 warning C4838: conversion from 'int' to 'short' requires a narrowing conversion
error C2397: conversion from 'int' to 'short' requires a narrowing conversion

我认为这段代码没问题,但它不是根据 MSVC 2015 CTP 编译器(但 Intellisense 没有指出)。是否有一些我错过的模糊小规则使 MSVC 正确?

如果是这样,为什么相同的表达式在一种情况下是警告,而在另一种情况下是错误

我想像这样在循环变量的初始化中使用它:

MY_COORD pos = ResultFromFunction();
auto rows = pos.Y;
for ( auto i = (rows - rows); i < rows; ++i )
{
coord c{ 0 ,i };
...
}

最佳答案

算术运算符总是在执行操作之前将小于 int 的整数类型提升为 int。这是 C++11 标准的 [expr]/10 中强制要求的:

Many binary operators that expect operands of arithmetic or enumeration type cause conversions and yield result types in a similar way. The purpose is to yield a common type, which is also the type of the result. This pattern is called the usual arithmetic conversions.

那里适用于您的案例的子条款指定 rows - rows 中的操作数将进行积分提升。特别是,根据 [conv.prom]/1

A prvalue of an integer type other than bool, char16_t, char32_t, or wchar_t whose integer conversion rank is less than the rank of int can be converted to a prvalue of type int if int can represent all the values of the source type; otherwise, the source prvalue can be converted to a prvalue of type unsigned int.

由于 short 的等级保证小于 int 的等级,因此 rows - rows 的操作数都被提升为int,给表达式 rows - rows int 类型。

关于窄化转换,标准规定(在[dcl.init.aggr]),在聚合初始化中,如果表达式需要窄化转换,程序是病式的。编译器可以随意诊断它。 IIRC,在像 t_crd crd5 { x5 ,y5 }; 这样的简单情况下,clang 3.5 发出错误,而 g++ 4.9.2 在使用默认警告设置时发出警告。无论哪种方式。 MSVC 的行为即使有点奇怪,也是符合标准的。

关于c++ - 自动类型推导没有按预期工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29068333/

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