目前在我的作业中遇到这个问题。我相信只有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)正确,构造函数存在。
无论如何,这都是我的理由,但我不确定我要去哪里。
的规则是,(从/到这里从类型转换为另一种时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)时返回。