【问题标题】: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

标签: c++ c++11 types auto ternary-operator


【解决方案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.0common 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,正如预期的那样。

    【讨论】:

    猜你喜欢
    • 2011-11-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-12
    • 1970-01-01
    • 1970-01-01
    • 2011-12-18
    相关资源
    最近更新 更多