奇怪类型的演绎
Strange type deduction
今天我看到了一个非常奇怪的类型推导。这是代码:
unsigned int y = 15;
int k = 5;
auto t = k - y / 2;
由于k
是int
,所以我认为t
的类型也应该是int
。但令我惊讶的是,它的类型是unsigned int
。我不明白为什么类型被推导为unsigned int
。知道为什么吗?
由于通常的算术转换,如果两个操作数具有相同的转换秩,而其中一个操作数的类型为无符号整数,则表达式的类型具有相同的无符号整数类型。
来自C++17标准(5个表达式,第10页(
否则,如果具有无符号整数类型的操作数具有秩大于或等于另一操作数的类型的秩,带符号整数类型的操作数应转换为无符号整数类型的操作数。
注意类型unsigned int
的转换秩等于类型int
的秩(signed int
(。来自C++17标准(4.13整数转换等级,第1页(
—任何无符号整数类型的秩都应等于对应的有符号整数类型
下面是一个更有趣的例子。让我们假设有两个声明
unsigned int x = 0;
long y = 0;
并且这两种类型的宽度相同并且例如等于CCD_ 10字节。众所周知,类型long
的秩大于类型unsigned int
的秩。出现了一个问题,表达式的类型是什么
x + y
表达式的类型为unsigned long
.:(
这里是一个演示程序,但使用了类型long long
和unsigned long
来代替类型long
和unsigned int
。
#include <iostream>
#include <iomanip>
#include <type_traits>
int main()
{
unsigned long int x = 0;
long long int y = 0;
std::cout << "sizeof( unsigned long ) = "
<< sizeof( unsigned long )
<< 'n';
std::cout << "sizeof( long long ) = "
<< sizeof( long long )
<< 'n';
std::cout << std::boolalpha
<< std::is_same<unsigned long long, decltype( x + y )>::value
<< 'n';
return 0;
}
程序输出为
sizeof( unsigned long ) = 8
sizeof( long long ) = 8
true
这就是表达式CCD_ 18的类型是CCD_。
相关文章:
- 为什么 std::array 的演绎指南不允许不同的类型?
- 类型演绎 C++ 标准和自动
- λ类型演绎失败
- decltype(auto) 类型演绎:返回 x 与返回 (x)
- 使用decltype的动态多态类型演绎
- 普遍类型演绎scott-meyers
- c++ 11使用std::函数进行类型演绎
- 使用通用引用时进行类型演绎
- c++如何在无法进行类型演绎时调用模板化构造函数
- 函数模板中返回类型的模板实参演绎
- c#泛型中的类型演绎类似于c++模板
- 类型演绎不适用于std::function
- 为什么decltype返回类型在递归模板中失败,而返回类型演绎却工作得很好?
- 表达式模板中的按引用捕获可以与类型演绎共存
- 类型演绎模板函数c++
- 模板,类型演绎不足
- 用演绎的类型公开类成员函数
- 括号初始化列表和函数模板类型演绎顺序
- 在模板演绎中保持函数指针形参的完整类型
- c++类型强制演绎