如何在C ++中正确初始化Struct

Ale*_*x M 0 c++ struct

目前在我的作业中遇到这个问题。我相信只有4,7个不正确(在Visual Studio中,它们不会引发错误)。但老实说,我不确定为什么他们是唯一的。由于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)
}
Run Code Online (Sandbox Code Playgroud)

正确的是:

a)1-3

b)1-3,5,9

c)1-6、8、9

d)1-7

e)1-3,5,6,9

f)没有

我的推理:

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

2)更正,构造函数默认值或值(4)

3)正确的默认构造函数

4)不正确,没有用于int的构造函数

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

6)正确,默认

7)不正确,与4相同

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

9)正确,构造函数存在。

无论如何,这都是我的理由,但我不确定我要去哪里。

YSC*_*YSC 6

的规则是,(从/到这里从类型转换为另一种时int,double,A,B或C):只有一个用户提供的转换可以使用。

这使得确实B b = 5; // (4)无效,因为5(一int)需要:

  • 转换为double(first standart-conversion),
  • 然后进行A(第一次用户定义的转换),
  • 然后进行B(第二次用户定义的转换)。

最后一个违反规则,此转换顺序不合法。

老实说,我不确定他们为什么[不正确]。

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


最后,您可以给老师留下深刻的印象std::is_convertible:

std::is_convertible_v<B, C>true当iff B可转换为C(demo)时返回。