【问题标题】:Is double-braced scalar initialization allowed by the C++ standard?C++ 标准是否允许双括号标量初始化?
【发布时间】:2019-02-04 02:50:37
【问题描述】:

我有以下代码:

int x = {{}};

根据 C++ 标准,此语法是否有效? (我对 C++11 及更高版本感兴趣。)

使用最新的编译器没有问题,但是在一些较旧的编译器(例如 GCC 4.8.5)中会出现以下错误:

错误:为类型“int”的标量初始化器加上大括号

【问题讨论】:

    标签: c++ c++11 language-lawyer


    【解决方案1】:

    这是格式错误的。 gcc 接受它是错误的,clang 似乎允许它作为扩展名,如it warns about it

    我将引用最新的草稿,但这并没有什么不同。根据[dcl.init.list],列表初始化工作如下,在这种情况下,T 是int

    • 如果初始化列表是指定初始化列表,[...] =>不是
    • 如果 T 是一个聚合类 [...] => 它不是
    • 如果 T 是字符数组 [...] => 则不是。
    • 如果 T 是一个聚合 [...] => 它不是(只有数组和类可以是聚合)
    • 如果初始化列表没有元素 [...] => 它没有
    • 如果 T 是 std::initializer_list [...] => 的特化,则不是
    • 如果 T 是类类型 [...] => 不是
    • 如果 T 是具有固定基础类型的枚举 [...] => 它不是
    • 如果初始化列表有一个类型为 E [...] => 括号初始化列表没有类型,所以没有
    • 如果 T 是引用类型 [...] => 它不是
    • 如果初始化列表没有元素 [...] => 它没有
    • 否则程序格式错误

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-07-24
    • 2014-05-15
    • 2016-11-11
    • 1970-01-01
    • 2013-09-25
    • 1970-01-01
    相关资源
    最近更新 更多