如何在c ++

时间:2019-05-02 12:59:29

标签: 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)
}

正确的是:

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)正确,存在构造函数。

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

1 个答案:

答案 0 :(得分:6)

规则是,从一种类型转换为另一种类型(此处为intdoubleABC时): only one user-provided conversion can be used

这实际上使B b = 5; // (4)无效,因为5int)必须为:

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

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

  

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

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


最后,您可以用std::is_convertible打动您的老师:

std::is_convertible_v<B, C>返回true,前提是B可转换为Cdemo)。