C++ 11中"auto var = {condition}?1:1.0"的类型是什么?是双重还是整数?

wef*_*fa3 8 c++ types ternary-operator auto c++11

在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;
}
Run Code Online (Sandbox Code Playgroud)

tux*_*ux3 9

类型将是double,因为它是文字的常见类型11.0.

有一种简单的方法来测试它typeid:

#include <iostream>
#include <typeinfo>
using namespace std;

int main() {
    auto x = true ? 1 : 1.0;
    cout << typeid(x).name() << endl;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

d是我的GCC版本的输出.echo d | c++filt -t然后运行告诉我们d对应于类型double,如预期的那样.

  • [这里另一个有用的C++资源](http://en.cppreference.com/w/cpp/types/common_type)声称`common_type`是根据什么来定义的?:`运算符生成. (2认同)

Vla*_*cow 5

根据C++标准中的条件运算符的描述(5.16条件运算符)

6在第二个和第三个操作数上执行左值到右值(4.1),数组到指针(4.2)和函数到指针(4.3)标准转换.完成转换后,以下其中一项应成立:

- 第二个和第三个操作数具有算术或枚举类型; 执行通常的算术转换以使它们成为公共类型,结果是该类型.

和(5个表达式)

10许多期望算术或枚举类型操作数的二元运算符会以类似的方式引起转换并产生结果类型.目的是产生一个通用类型,它也是结果的类型.此模式称为通常的算术转换,其定义如下:

- 否则,如果任一操作数为double,则另一个操作数应转换为double.

在条件运算符的两个用法中,一个操作数是具有double类型的浮动文字 - 1.0(C++标准:浮点文字的类型是精度,除非后缀明确指定.)

auto x = true ? 1 : 1.0;
auto y = false ? 1 : 1.0;
Run Code Online (Sandbox Code Playgroud)

因此,另一个操作数也将转换为double类型,表达式的结果类型为double.