【问题标题】:In-class member initialization with an initializer list using uniform initialization syntax? [duplicate]使用统一初始化语法使用初始化列表进行类内成员初始化? [复制]
【发布时间】:2014-06-04 10:46:18
【问题描述】:

我正在尝试使用 MSVC2013 编译以下内容:

class SomeClass
{
    struct SomeStruct { bool a,b,c; };
    SomeStruct ss{false, false, false};
}

编译器给我以下错误:SomeClass::SomeStruct::SomeStruct: no overloaded function takes 3 arguments.

如果我把代码改成这样:

class SomeClass
{
    struct SomeStruct { bool a,b,c; };
    SomeStruct ss{{false, false, false}};
}

程序编译并运行良好。这是编译器的问题,还是我不懂语法?根据我一直在阅读的内容,第一个版本应该可以编译。

【问题讨论】:

标签: c++ c++11 initializer-list uniform-initialization in-class-initialization


【解决方案1】:

这是来自 N3797 的负责语法:

// after a member declaration:
braced-or-equal-initializer-list:
  = initializer-clause
  braced-init-list

braced-init-list:
  { initializer-list ,OPT }
  { }

initializer-list:
  initializer-clause
  initializer-list, initializer-clause

initializer-clause:
  assignment-expression
  braced-init-list

所以我会说第一个陈述是正确的,它确实被 最近的gccclang

【讨论】:

    【解决方案2】:

    如果根据需要放置分号

    class SomeClass
    {
        struct SomeStruct { bool a,b,c; };
        SomeStruct ss{false, false, false};
    };
    

    那么它似乎是MS VC++ 2013编译器的一个错误。至少代码在 www.ideone.com 编译成功。

    结构 SomeStruct 是一个聚合体,应该使用初始化列表进行初始化。

    【讨论】:

    • 是的,这是问题中的一个错字。谢谢,马上更新。
    猜你喜欢
    • 1970-01-01
    • 2019-11-24
    • 2016-06-23
    • 2019-09-10
    • 2015-09-25
    • 1970-01-01
    • 2015-04-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多