gpt4 book ai didi

c++ - static_cast const 引用 void*

转载 作者:行者123 更新时间:2023-12-01 22:34:29 31 4
gpt4 key购买 nike

我有一个对 void* 的 const 引用:

void* p;
void* const& x = p;

我想将其转换为对 T* 的 const 引用(对于某些 struct T {};)。在我能想到的三种方法中,我默认选择的 static_cast 不起作用:

T* const& y = static_cast<T* const&>(x);       // doesn't work
T* const& y = reinterpret_cast<T* const&>(x); // works
T* const& y = (T* const&) x; // works

GCC 给出以下错误:

error: invalid static_cast from type ‘void* const’ to type ‘T* const&’
T* const& y = static_cast<T* const&>(x);

我想了解这意味着什么,以及是否有办法解决它。

<小时/>

编辑(2019-11-26):

评论和答案中有关于T* const&(和void* const&)是否是的讨论

  1. T* 的常量引用;或
  2. const T* 的引用。

评论中的共识似乎是选项 2。但从下面的示例来看,在我看来,这是选项 1。

假设我有一个带有非常量函数 f() 的类 T:

struct T
{
void f() {}; // NB: non-const
};

我们可以考虑两种选择:

const T*  x;
T* const& y;

通过它们调用f()会产生不同的效果:

x->f();   // compile-time error (passing ‘const T’ as ‘this’ argument discards qualifiers)
y->f(); // works fine

这是否表明选项 1 是正确的?有人可以帮我解决这个问题吗?

最佳答案

您不能将引用绑定(bind)到任何其他类型(除了同一类型的较少 cv 限定版本或涉及通过特殊类型(例如 unsigned char&)读取单个字节的某些微妙事物)。如果您使用reinterpret_cast(包括通过C 风格的强制转换)强制解决问题,则使用结果(除了将其强制转换回来)是未定义的行为。 p>

您可以(仅使用static_cast)将void*转换为T*,并且您可以提供便利,例如

const auto y=[&] {return static_cast<T*>(p);};

这样你以后就可以通过在任何地方写入y()来跟踪p的当前值。 (由于它按值返回,因此您确实无法根据需要编写 y()=new T。)

关于c++ - static_cast const 引用 void*,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59038846/

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