gpt4 book ai didi

c++ - 使用类内成员初始化器进行结构初始化

转载 作者:行者123 更新时间:2023-11-30 02:54:52 26 4
gpt4 key购买 nike

我在初始化使用类内初始化程序的结构时遇到问题:

struct A
{
int a{};
int b{};
};

struct B
{
int a;
int b;
};

int main()
{
A a; // OK
B b{1, 2}; // OK
B b2; // OK, but b.a and b.b are undefined
A a2{1, 2}; // ERROR!
}

这是我从 gcc 4.7.2 得到的错误:

% g++ -std=c++11 test2.cc
test2.cc: In function ‘int main()’:
test2.cc:16:11: error: no matching function for call to ‘A::A(<brace-enclosed initializer list>)’
test2.cc:16:11: note: candidates are:
test2.cc:1:8: note: constexpr A::A()
test2.cc:1:8: note: candidate expects 0 arguments, 2 provided
test2.cc:1:8: note: constexpr A::A(const A&)
test2.cc:1:8: note: candidate expects 1 argument, 2 provided
test2.cc:1:8: note: constexpr A::A(A&&)
test2.cc:1:8: note: candidate expects 1 argument, 2 provided

这应该符合标准,还是这实际上是非法的?我是否在滥用类内初始化器?我原以为新的语法会成功,这样我就不必编写一个构造函数来完成这个初始化,但现在看来我可能不得不求助于那个旧机制来避免未初始化结构的可能性。

最佳答案

如果有,你只能使用大括号

  • 大括号内容匹配一个构造函数(不是你的情况),或者

  • 类是一个聚合,每个大括号元素匹配一个类成员。

但是,如果 (C++11, 8.5.1/1):

it has no brace-or-equal-initializers for non-static members

你的类(class)显然有。因此,您也没有聚合。

要么编写合适的构造函数,要么删除大括号或相等的初始化程序。

关于c++ - 使用类内成员初始化器进行结构初始化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16795477/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com