c++ - 为什么 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 编译的规则。
解决方案
推荐阅读
- graphql - AWS AppSync 初始批量放置不更新缓存
- tensorflow - TensorFlow Lite 预训练模型需要哪些输入预处理
- chart.js - Chart Js,以不同方式在轴上设置一些刻度
- macos - mac Mojave 中的“编码所选视频文件”在哪里?
- python - 针对 Access 数据库的 pyodbc 查询出现“未实现可选功能”错误
- django - Django 管理员发送电子邮件以进行新用户注册
- javascript - Shopify - 自定义 createCart() 并在没有购买按钮的页面上使用
- mysql - Rails 组收集和汇总某些字段
- java - 使用 Java 执行 jar 文件只能在 pc 到 pc 的基础上工作
- pyspark - 在具有复杂要求的 pyspark SQL 查询方面需要帮助