C++ 入门 5 版。相互转化

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我没有收到任何错误!他的解释看起来很合逻辑,但我不知道为什么代码运行良好?!

eer*_*ika 5

但是当我定义了所需的成员并且 f 我没有收到任何错误!

由于书中描述的原因,显示的程序格式不正确。如果编译器未能发出诊断消息,则编译器不符合标准。

我正在使用 GCC。

您可以使用该-pedantic选项要求 GCC 尝试符合 C++ 标准。不幸的是,否则默认情况下它会启用某些语言扩展。