【问题标题】:C++11: how does auto deal with () initializer?C++11:自动如何处理 () 初始化程序?
【发布时间】:2023-03-18 02:30:01
【问题描述】:

我知道对于 C++11 使用 auto 初始化 vector 的方法,实际上初始化了 std::initializer_list 而不是 vector。 但是,给出以下代码:

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

int main() {
    auto x = {1, 2};
    cout << typeid(x).name() << endl;
    auto z = (1, 2);
    cout << z << ", type: " << typeid(z).name() << endl;
    return 0;
}

我不明白:

  1. 为什么返回的x 的类型是St16initializer_listIiE 而返回的'z' 的类型是'i',使用gcc-10 编译器。我们不应该只返回std::initializer_list 和'int'吗?
  2. z 上有警告:warning: left operand of comma operator has no effect [-Wunused-value]。然后结果的第二半是:2, type: i。 c++11如何解释()-initialized类型?为什么只有最后一个元素传递给z,因此z 仍然是int 类型?

【问题讨论】:

  • type_info::name 不需要生成类型的实际名称;这是一个实现定义的值。
  • 如果你想要去杂乱的名字,你可以使用 Boost 的Demangle 把它们变成更清晰的字符串。

标签: c++ c++11 initializer-list auto


【解决方案1】:

为什么 x 返回的类型是 St16initializer_listIiE 而 'z' 返回的类型是 'i',使用 gcc-10 编译器。我们不应该只返回 std::initializer_list 和 'int' 吗?

typeid() 不会直接给出你所期望的,它只是返回其代码中写下的特定类型标识。如果你想解密,请通过c++filt传递:

c++filt -t St16initializer_listIiE

这将导致您所期望的,即:

std::initializer_list<int>

z 上有一个警告:警告:逗号运算符的左操作数无效[-Wunused-value]。然后结果的第二半是:2,输入:i。 c++11如何解释()初始化的类型?为什么只有最后一个元素传入 z ,因此 z 仍然是 int 类型?

( ) 是一个包含表达式或表达式列表的初始化程序。如果将其分配给auto,它将选择表达式列表中的最后一项作为其类型,因为它将用逗号分隔,直到最后一个表达式出现,理想情况下告诉 auto 将其类型分配给最后一个。

例如:

auto x = (1, 1.5L); 

会导致很长。

auto x = (1, 1.5f);

会导致浮动。

auto x = (1, "string");

会产生一个 const char 指针。

它完全忽略了( ) 初始化器中的第一个值,即int

【讨论】:

    【解决方案2】:

    创建初始化列表的唯一东西是{}。在

    auto z = (1, 2);
    

    您所拥有的是逗号运算符,它只返回最后一个值。所以这意味着你的代码归结为

    auto z = 2;
    

    由于2intzint

    【讨论】:

      【解决方案3】:
      1. 因为{ 1, 2 }std::initializer_list&lt;int&gt;,但(1, 2) 是一个表达式,它扩展为逗号运算符(它计算两个参数并返回第二个参数作为结果,所以(1, 2) 被折叠到(2),它被折叠成2。这就是为什么auto z = (1, 2);计算成整数初始化的原因。

      2. 因为指令1 的结果被简单地忽略(记住(1, 2) 计算两个表达式并丢弃第一个的结果)。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-12-17
        • 2011-12-05
        • 2018-05-14
        • 1970-01-01
        相关资源
        最近更新 更多