gpt4 book ai didi

c++ - 为什么 C++ 标准要求编译器忽略对基本类型的转换运算符的调用?

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:06:22 24 4
gpt4 key购买 nike

采用以下代码:

#include <iostream>

struct Base {
char x = 'b';
};

struct Derived : Base {
operator Base() { return Base { 'a' }; }
};

int main() {
Derived derived;
auto base = static_cast<Base>(derived);

std::cout << "BASE -> " << base.x << std::endl;
}

在 g++ 和 clang++ 下,这会产生:

BASE -> b

我期待的是:

BASE -> a

为什么?因为我阅读这段代码的原因,我在 Derived 中看到一个转换运算符,它返回一个包含 'a'Base 实例。

clang++ 礼貌地发出警告:

main.cpp:9:5: warning: conversion function converting 'Derived' to its base class 'Base' will never be used
operator Base() { return Base { 'a' }; }

研究此警告后,我发现这是设计使然(为清楚起见进行了解释):

class.conv.fct

The type of the conversion function ([dcl.fct]) is “function taking no parameter returning conversion-type-id”. A conversion function is never used to convert a (possibly cv-qualified) object [...] to a (possibly cv-qualified) base class of that type (or a reference to it) [...].

所以这两个编译器似乎都在做正确的事情。我的问题是,为什么标准要求这种行为?

最佳答案

如果您可以覆盖 C++ 中的基类转换,那么您就可以破坏很多东西。例如,您究竟如何能够访问一个类的实际基类实例?您需要一些 baseof 模板,类似于 std::addressof 用于绕过 il-conceeded operator& 重载。

允许这样做会导致混淆代码的含义。有了这条规则,很明显,在所有情况下,将类转换为其基类都会复制基类实例。

关于c++ - 为什么 C++ 标准要求编译器忽略对基本类型的转换运算符的调用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42373862/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com