C ++ 11中“auto var = condition?1:1.0”的类型是啥?它是双精度还是整数?
Posted
技术标签:
【中文标题】C ++ 11中“auto var = condition?1:1.0”的类型是啥?它是双精度还是整数?【英文标题】:What is the type of "auto var = condition ? 1 : 1.0" in C++11? Is it double or int?C ++ 11中“auto var = condition?1:1.0”的类型是什么?它是双精度还是整数? 【发布时间】:2015-05-07 07:36:00 【问题描述】:在 C++11 中,当我写这篇文章时,x
和 y
的类型是什么?
int main()
auto x = true ? 1 : 1.0;
auto y = false ? 1 : 1.0;
std::cout << x << endl;
std::cout << y << endl;
return 0;
【问题讨论】:
template<class>struct typeof;template struct typeof<std::common_type_t<int,double>>;
你可以使用typeid(我也认为 boost 有自己的 typeid 之类的东西)
是int
和double
的常用类型,所以double
。
【参考方案1】:
根据C++标准中条件运算符的描述(5.16条件运算符)
6 左值到右值 (4.1)、数组到指针 (4.2) 和 函数到指针 (4.3) 标准转换是在 第二和第三个操作数。在这些转换之后,其中一个 以下应成立:
——第二和第三个操作数具有算术或枚举类型; 执行通常的算术转换以将它们转换为通用类型,结果就是该类型。
和(5 个表达式)
10 许多二元运算符需要算术或运算操作数 枚举类型导致转换并产生类似的结果类型 大大地。目的是产生一个通用类型,这也是 结果。 这种模式称为通常的算术转换, 定义如下:
——否则,如果任一操作数为双精度,则应转换另一个操作数 加倍。
在条件运算符的两种用法中,操作数之一是具有 double 类型的浮动文字 - 1.0
(C++ 标准:浮动文字的类型是 double 除非明确指定后缀。)
auto x = true ? 1 : 1.0;
auto y = false ? 1 : 1.0;
所以另一个操作数也将被转换为 double 类型,表达式的结果为 double 类型。
【讨论】:
【参考方案2】:类型将是double
,因为它是文字1
和1.0
的common type。
有一个简单的方法可以使用typeid
进行测试:
#include <iostream>
#include <typeinfo>
using namespace std;
int main()
auto x = true ? 1 : 1.0;
cout << typeid(x).name() << endl;
return 0;
这会在我的 GCC 版本上输出 d
。
运行echo d | c++filt -t
然后告诉我们d
对应于类型double
,正如预期的那样。
【讨论】:
Another useful C++ resource here 声称common_type
是根据 ? :
运算符产生的内容来定义的。以上是关于C ++ 11中“auto var = condition?1:1.0”的类型是啥?它是双精度还是整数?的主要内容,如果未能解决你的问题,请参考以下文章
为啥 C11 或 C++11 中没有 ASCII 或 UTF-8 字符文字?