gpt4 book ai didi

c++ - 为什么不允许将 Derived T::* 转换为 Base T::*?

转载 作者:搜寻专家 更新时间:2023-10-31 01:02:53 25 4
gpt4 key购买 nike

背景:许多函数式语言支持代数数据类型,在一定程度上可以用虚函数和继承来模拟。

最明显的解决方案涉及堆分配,因为派生类型进来了不同的尺寸。但是,我们应该能够使用 union 来保存堆栈中最大的类型,而无需任何额外分配。这需要一个额外的指向基的指针与 union 一起存储,同时使复制和赋值变得复杂。

通过将成员选择器存储为从指向事件 union 成员的 union 开头的偏移量来解决后一个问题是很有说服力的。 C++ 有一些成员指针,它们看起来几乎适合这个目的,只是指向每个成员的指针将具有不同的类型。

问题:为什么不允许将 Derived T::* 转换为 Base T::*?

这是一个玩具示例,与上述内容无关,但遇到了相同的限制:

struct fish {};
struct shark : public fish {};
struct trout : public fish {};

struct aquarium
{
shark shark;
trout trout;
};

fish aquarium::* pick_dinner(bool dangerous = true)
{
if (dangerous)
{
return &aquarium::shark;
}
return &aquarium::trout;
}

#include <iostream>

void cook(fish&)
{
std::cerr << "Do it yourself\n";
}

int main()
{
aquarium spherical, hexagonal;
fish aquarium::*ingredient = pick_dinner();
cook(spherical.*ingredient);
cook(hexagonal.*ingredient);
}

生成的编译错误:

main.cpp:15:16: error: cannot initialize return object of type 'fish aquarium::*' with an rvalue of type 'shark aquarium::*'
return &aquarium::shark;
^~~~~~~~~~~~~~~~
main.cpp:17:12: error: cannot initialize return object of type 'fish aquarium::*' with an rvalue of type 'trout aquarium::*'
return &aquarium::trout;
^~~~~~~~~~~~~~~~
2 errors generated.

最佳答案

为什么不允许投Derived T::*Base T::*

因为语言标准不允许。除了空成员指针转换外,唯一允许的成员转换指针是类型 <em>cv</em> T Base::* 的转换。至 <em>cv</em> T Derived::* , 如标准部分所述 4.11/2 .

我不知 Prop 体原因,但是对应Core language issue 794rejected由于“在标准化过程的这一点上没有就此更改达成共识”。 Recent activity关于这个问题表明它可能会在下一个 C++ 标准 (C++17) 中发生变化。

关于c++ - 为什么不允许将 Derived T::* 转换为 Base T::*?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26338402/

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