【问题标题】:Type of an auto initialized list自动初始化列表的类型
【发布时间】:2016-10-17 19:26:58
【问题描述】:

在下面的 C++ 代码中,a 的类型是什么? typeid 返回St16initializer_listIPKcE

auto a = { "lol", "life" };

【问题讨论】:

  • 您使用的是什么标准? 11、14、17? auto initializer_list 有点不稳定...
  • const volatile auto a = { "trollin'" };

标签: c++ types initializer-list auto


【解决方案1】:

当你有

auto a = { "lol", "life" };

编译器将尝试推断出std::initializer_list,其中类型是所有元素的类型。在这种情况下,"lol""life" 都是 const char[],所以你有一个 std::initializer_list<const char*>

如果你有类似的东西

auto foo = { 1, 2.0 };

那么你会遇到编译器错误,因为元素类型不同。

初始化器列表的自动推演规则如下,期待

auto x1 = { 1, 2 }; // decltype(x1) is std::initializer_list<int>
auto x2 = { 1, 2.0 }; // error: cannot deduce element type
auto x3{ 1, 2 }; // error: not a single element
auto x4 = { 3 }; // decltype(x4) is std::initializer_list<int>

期望是在 C++17 之前

auto x5{ 3 };

std::intializer_list&lt;int&gt;,在 C++17 和大多数已经采用该规则的编译器中,它被推断为 int

【讨论】:

    【解决方案2】:

    你的问题的答案是std::intializer_list&lt;char const*&gt;

    如果你想学习一个类型的非重命名,你可以使用未定义的模板技巧:

    template<typename T>
    void get_type_name(T&&);
    

    然后调用它

    auto a = { "",  ""};
    get_type_name(a);
    

    您应该会收到一条可读的错误消息,说明类似于

    undefined reference to `void get_type_name<std::initializer_list<char const*>&>(std::initializer_list<char const*>&)'
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-02-27
      • 1970-01-01
      • 2017-09-09
      • 1970-01-01
      • 2021-05-31
      • 1970-01-01
      • 2015-05-22
      • 1970-01-01
      相关资源
      最近更新 更多