【问题标题】:priority of implicit conversions隐式转换的优先级
【发布时间】:2017-12-07 18:53:11
【问题描述】:

我有两个可以互换的课程。 A 可以转换为 B,B 可以转换为 A。我想要的是一种指定 A 转换为 B 是首选的方法,但仍然可以执行以下操作:

B b = A();
B b; b = A();

我试图避免的是这个问题: 乙 b = q ? A() : B();

错误:条件表达式不明确; 'A'可以转换为'B',反之亦然

我尝试了一系列显式设置,但我无法确定这是否可行。我宁愿不必在这些上调用 static_cast。

struct B;
struct A {
    int a;
    A () {
    }
    A (B b);
    explicit operator B ();
};
struct B {
    int b;
    B () {
    }
    B (A a);
    explicit operator A ();
};
A::A (B b) {
}
A::operator B () {
    B b;
    return b;
}
B::B (A a) {
}
B::operator A () {
    A a;
    return a;
}
int main () {
    int q;
    A a;
    B b;
    A ab = q ? a : b;
    B b2 = a;
}

【问题讨论】:

  • 解决办法就是这样做A ab = q ? (A)a : (A)b;
  • 拥有两种相互了解且可相互转换的类型往往是次优设计。 Scala 有一些这样的类型,现在他们建议不要这样做。推理起来要容易得多。

标签: c++ implicit-conversion


【解决方案1】:

解决方案是这样做A ab = q ? (A)a : (A)b;,这样每个人都被显式强制转换,而您的代码试图隐式执行此操作。

【讨论】:

  • 实际上,即使A ab = q ? a : A(b);A ab = q ? a : (A)b; 也可以使用,因为您需要两者具有相同的类型。但我认为问题是如果没有这一切,它是否可以工作
  • 是的,许多不同的解决方案都可以使用@A.A,除了那些需要隐式转换的解决方案
  • @A.A 我正在按照您在当前实施中的建议进行操作。但正如您已经指出的那样,我有兴趣避免这种情况。
  • 不确定你能得到你想要的。该标准说“尝试形成从 T1 类型的操作数表达式 E1 到与操作数表达式 E2 的类型 T2 相关的目标类型的隐式转换序列”和“使用此过程,确定是否隐式转换序列可以从第二个操作数形成为第三个操作数确定的目标类型,反之亦然。如果可以形成两个序列,或者可以形成一个但它是不明确的*转换序列,程序是**格式错误的”。也许代理类可以提供帮助......?
  • 如果你删除显式关键字@nachum 就可以了
猜你喜欢
  • 2017-07-04
  • 2012-05-04
  • 1970-01-01
  • 2020-11-26
  • 1970-01-01
  • 1970-01-01
  • 2021-09-03
  • 1970-01-01
  • 2014-02-24
相关资源
最近更新 更多