加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c – 如何使初始化器列表和类成员初始化程序一起工作?

发布时间:2020-12-16 03:11:11 所属栏目:百科 来源:网络整理
导读:以下代码既不能在 gcc-4.7.1和clang-3.2之间编译-std = c 11.所以我觉得我做错了.但我不知道为什么有人可以给我一个提示吗?基本上如果我删除X的类成员初始化器,它的工作.那么为什么初始化器列表不能与类成员初始化器一起工作? struct X { int x = 1; int y
以下代码既不能在 gcc-4.7.1和clang-3.2之间编译-std = c 11.所以我觉得我做错了.但我不知道为什么有人可以给我一个提示吗?基本上如果我删除X的类成员初始化器,它的工作.那么为什么初始化器列表不能与类成员初始化器一起工作?
struct X {
    int x = 1;
    int y = 1;
};

int main() {
    X x = {1,2};
}

gcc编译错误:

a.cpp: In function 'int main()':
a.cpp:7:16: error: could not convert '{1,2}' from '<brace-enclosed initializer list>' to 'X'

解决方法

通过在声明点初始化非静态数据成员,您的类不再是聚合(参见8.5.1聚合[decl.init.aggr]).

解决方法是添加一个双参数构造函数.这允许您使用initializer-list初始化,即使您的类在技术上不是聚合,也允许与聚合初始化相同的语法.

struct X {
  X(int x,int y) : x(x),y(y) {}
    int x = 1;
    int y = 1;
};

int main() 
{
    X x1{1,2};
    X x2 = {1,2};
}

注意:这些规则已经为C 1y放宽,这意味着您的类型确实是一个聚合.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读