【问题标题】:Does C++11's unified initialize contains an implicit type conversion to array?C++11 的统一初始化是否包含到数组的隐式类型转换?
【发布时间】:2016-10-06 18:05:14
【问题描述】:
auto buf={1,2,3}

这里“buf”的类型是std::initializer_list,但是

int buf[]={1,2,3};

左边的表达式是变量“buf”的声明,类型为int[],右边是std::initializer_list

那么这里有隐式类型转换,从 std::initializer_list 到 int[]?还是新的 STL 定义了这样的转换?

如何证明这里有没有这样的转换?

【问题讨论】:

  • 语法type id = {values} 称为复制列表初始化。当您第一次使用它时,它评估为std::initializer_list。它是在标准中定义的,而不是 STL。
  • 不,右侧是一个 braced-init-list(语法结构),而不是 std::initializer_list(上述语法结构可能或可能不会引起)。 braced-init-list 在不同的上下文中意味着不同的东西。当它作为数组的初始化器出现时,它是聚合初始化(早于统一初始化)。

标签: arrays c++11 implicit initializer-list


【解决方案1】:

auto buf = {1, 2, 3}; 的情况下,编译器必须推断buf 是什么类型并选择std::initializer_list<int>

但是在int buf[] = {1, 2, 3}; 的情况下,它知道buf 的类型并且初始化它的唯一方法是通过聚合初始化。另请注意,大小未指定,而是由提供的元素数量推导出来的。这是数组独有的。

这里没有可用的转换。如果您尝试从 std::initializer_list<int> 强制构造,则会出现编译错误:

main.cpp:8:9: error: array initializer must be an initializer list
    int buf[] = std::initializer_list<int>({1, 3, 4});
        ^

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-09-13
    • 1970-01-01
    • 2010-09-21
    • 1970-01-01
    • 1970-01-01
    • 2016-04-27
    • 2021-09-21
    相关资源
    最近更新 更多