当前在我的作业中遇到此问题。我相信只有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)正确,存在构造函数。
无论如何,这都是我的理由,但是我不确定我要去哪里。
答案 0 :(得分:6)
规则是,从一种类型转换为另一种类型(此处为int
,double
,A
,B
或C
时): only one user-provided conversion can be used。
这实际上使B b = 5; // (4)
无效,因为5
(int
)必须为:
double
(第一个 standart-conversion ),A
(第一次用户定义的转换),B
(第二次用户定义的转换)。最后一个违反规则,并且此转换顺序不合法。
老实说,我不确定他们为什么[错误]。
您可以使用此规则检查其他表达式。
最后,您可以用std::is_convertible
打动您的老师:
std::is_convertible_v<B, C>
返回true
,前提是B
可转换为C
(demo)。