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 中,当我写这篇文章时,xy 的类型是什么?

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&lt;class&gt;struct typeof;template struct typeof&lt;std::common_type_t&lt;int,double&gt;&gt;; 你可以使用typeid(我也认为 boost 有自己的 typeid 之类的东西) intdouble的常用类型,所以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,因为它是文字11.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”的类型是啥?它是双精度还是整数?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 CLion 中启用 C++11?

为啥 C11 或 C++11 中没有 ASCII 或 UTF-8 字符文字?

如何在 qmake 中禁用 C++11?

如何在 Eclipse Neon 中启用 C++11 语法?

我可以在 Xcode 中使用 C++11 吗?

在 c++/c++11 中测试“POD-ness”?