【问题标题】:C++ primer 5 ed. mutual conversionsC++ 入门 5 版。相互转换
【发布时间】: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


【解决方案1】:

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

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

我正在使用 GCC。

您可以使用-pedantic 选项让GCC 尝试符合C++ 标准。不幸的是,它会默认启用一些语言扩展。

【讨论】:

  • 好的,太好了!我在 repl.it 上尝试了代码,并收到了关于歧义的警告。太感谢了! .
猜你喜欢
  • 2021-09-04
  • 2021-08-25
  • 2021-11-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-22
  • 1970-01-01
相关资源
最近更新 更多