首页 > 解决方案 > 为什么 C++ 三元运算符返回类型不能是基类类型?

问题描述

如果我理解正确,则三元运算符具有返回类型。返回类型是从三元运算符的第二个和第三个参数类型推导出来的。如果我在不使用其结果的情况下编写三元运算符(下面的 L2),则没有其他信息可以推断返回类型。所以,如果我们想用一种方法来推断返回类型,我们就不能依赖于变量的类型,例如,我们将三元运算符返回的值放入其中(下面的 L1)。

但是,与其尝试将类型相互转换(这可能是不可能的),不如在标准中引入基类用例?

也就是说,如果参数 2 和 3 有一个公共基类,则将其用作引用/指针类型的三元运算符(以与其他现有规则兼容的方式)的返回类型。它将允许单行 const 引用/指针初始化(如下面的 L3,但没有强制转换)。

我想有一个很好的理由不这样做。

class A {};
class B : public A {};
class C : public A {};

int main()
{
  B* b = new B;
  C* c = new C;
  A * a1 = true ? b : c; // L1 does not compile
  true ? b : c; // L2 does not compile
  const A * a2 = false ? static_cast<A*>(b) : static_cast<A*>(c); // L3 does compile
}

编辑:更正示例以反映该问题与切片无关。

编辑:要清楚,我不是在问为什么代码不能编译。存在大量问题,问为什么。我在问为什么 C++ 标准没有实现使 L1 编译的规则。

标签: c++

解决方案


推荐阅读