Mae*_*tro 1 c++ type-conversion
我在理解相互转换方面有一些困难,在 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&))
Run Code Online (Sandbox Code Playgroud)
因为有两种方法可以从 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
Run Code Online (Sandbox Code Playgroud)
请注意,我们无法通过使用演员表来解决歧义——演员表本身也会有相同的歧义。”
f我没有收到任何错误!他的解释看起来很合逻辑,但我不知道为什么代码运行良好?!但是当我定义了所需的成员并且 f 我没有收到任何错误!
由于书中描述的原因,显示的程序格式不正确。如果编译器未能发出诊断消息,则编译器不符合标准。
我正在使用 GCC。
您可以使用该-pedantic选项要求 GCC 尝试符合 C++ 标准。不幸的是,否则默认情况下它会启用某些语言扩展。