【发布时间】:2020-05-06 16:41:54
【问题描述】:
我在理解相互转换方面有些困难,在 C++ Primer 5 ed. 中有解释:
"在下面的示例中,我们定义了两种从 B 中获取 A 的方法:使用 B 的转换运算符或使用采用 B:// 的 A 构造函数进行相互转换通常是个坏主意两种类类型之间:
struct B;
struct A {
A() = default;
A(const B&); // converts a B to an A
// other members
};
struct B {
operator A() const; // also converts a B to an A
// other members
};
A f(const A&);
B b;
A a = f(b); // error ambiguous: f(B::operator A())
// or f(A::A(const B&))
因为从 B 获取 A 有两种方法,编译器不知道要运行哪种转换;对 f 的调用是模棱两可的。此调用可以使用带 B 的 A 构造函数,也可以使用将 B 转换为 A 的 B 转换运算符。因为这两个函数同样好,所以调用是错误的。
如果我们想进行这个调用,我们必须显式调用转换运算符或构造函数:
A a1 = f(b.operator A()); // ok: use B's conversion operator
A a2 = f(A(b)); // ok: use A's constructor
请注意,我们无法通过使用转换来解决歧义——转换本身会 同样的模棱两可。”
- 但是当我定义所需的成员和
f时,我没有收到任何错误!他的解释看起来很合乎逻辑,但我不知道为什么代码运行良好?!
【问题讨论】:
-
问题是什么?
-
when I defined the required members and f I don't get any error没有歧义,因为声明清楚地说明了每个含义。 -
@Slava:书中说调用是模棱两可的,但是当我运行代码时它工作正常!
-
@dxiv:那么你认为这是书中的错误吗?
-
我看到了歧义。考虑在 A 的转换构造函数或 B 的转换运算符之一或两者前面添加
explicit。
标签: c++ type-conversion