如何正确初始化C++中的结构

如何正确初始化C++中的结构,c++,struct,C++,Struct,目前我的作业中遇到了这个问题。我相信在VisualStudio中只有4,7是不正确的,它们不会抛出错误。但我真的不知道为什么只有他们。因为3个可以工作,我认为它们也可以工作,但事实似乎并非如此。有什么建议吗 struct A { double x; A(double x = 1) : x(x) { } }; struct B { double x; B(A a = 2.0) : x(a.x) { } }; struct C { double x;

目前我的作业中遇到了这个问题。我相信在VisualStudio中只有4,7是不正确的,它们不会抛出错误。但我真的不知道为什么只有他们。因为3个可以工作,我认为它们也可以工作,但事实似乎并非如此。有什么建议吗

struct A {
    double x;
    A(double x = 1) : x(x) { }
};

struct B {
    double x;
    B(A a = 2.0) : x(a.x) { }
};

struct C {
    double x;
    C(B b = B(3)) : x(b.x) { }
};

int main() {
    A a; // (1)
    A a = 4; // (2)
    B b; // (3)
    B b = 5; // (4)
    B b(a); // (5) (a is an object of class A)
    C c; // (6)
    C c = 6.0; // (7)
    C c(a); // (8) (a is an object of class A)
    C c(b); // (9) (b is an object of class B)
}
正确的是:

a 1-3

b 1-3,5,9

c 1-6,8,9

d 1-7

e 1-3,5,6,9

我的理由是:

1正确,只是默认构造函数

2正确,构造函数默认值或值4

3正确的默认构造函数

4不正确,int没有构造函数

5正确,存在类型A对象的构造函数

6正确,默认

7不正确,与4相同

8这个我不确定,A类型的对象没有构造函数,所以我会说不正确

9正确,构造函数存在


这是我在任何情况下的推理,但我不确定我错在哪里。

规则是,当从一种类型转换为另一种类型时,这里从/转换为int、double、a、B或C:

这使得B实际上等于5;//4无效,因为5整数需要:

转换为双第一标准转换, 然后到第一个用户定义的转换, 然后到B秒的用户定义转换。 最后一个违反了规则,这个转换顺序是不合法的

老实说,我不知道他们为什么(不正确)

可以使用此规则检查其他表达式

最后,你可以通过以下方式给老师留下深刻印象:


std::is_Convertable_v返回真值,如果B可转换为C。

请将此代码的格式设置得更好一点,我无法理解它的正面或反面。为什么您认为案例4和7不正确?为什么你认为其他人是正确的?这里正确的定义是什么?从我的观点来看,这些都不正确,因为1具有非平凡构造函数的类不应该有任何公共字段2不应该有隐式构造函数,尤其是采用单个参数3应该使用直接列表初始化语法执行初始化4不应该使用单字母名称问题是什么?你想知道哪些是对的/错的,或者如何解决这些问题吗?关于8:按照YSC的答案,C ca可以由C::CB b构造,因为b::BA a可以用于a到b类的转换,并且只需要一个用户提供的转换。因此,在这种情况下,4和7不起作用。所以我想答案是没有?我误解为没有其他选择,没有任何选择。就像一个不同的组合,不同的组合是对的还是错的。但是使用is_convertive表明A不能转换为C,因此在这种情况下选项e似乎是正确的。@AlexM如果你仍然不确定C=A{}和C{A{}之间的区别,请问另一个问题;我们很乐意为您解答或指点。编辑:没关系:太好了,谢谢你的来源/建议:但是如果8也是正确的,那我就没有正确的选择了。如果它被称为b5;然后是选项c,但除此之外,没有选项只排除4和7。哈哈,这个答案对我来说已经足够好了