将其转换为 void*&

Cast this to void*&

我有一个接受 void*& 作为参数的方法,我想将 this 作为参数传递。

示例:

struct A
{
    void foo()
    {
        bar((void*&)this);
    }
private:
    void bar(void*& p) {}
};

我有以下编译器错误:

cast_this.cpp: In member function 'void A::foo()':
cast_this.cpp:5:14: error: invalid cast of an rvalue expression of type 'A*' to type 'void*&'
  bar((void*&)this);
              ^

有什么方法可以转换 this 指针吗?

编辑: 尝试 bar((void* const &)this); 给出:

cast_this.cpp: In member function 'void A::foo()':

cast_this.cpp:5:25: error: binding 'void* const' to reference of type 'void*&' discards qualifiers
  bar((void* const &)this);
                         ^
cast_this.cpp:8:10: note:   initializing argument 1 of 'void A::bar(void*&)'
     void bar(void*& p) {}
          ^

正如对您的问题的评论中所建议的,您可以使用 const 限定条件(因为 this 实际上是 const) - 但您需要它用于转换和参数:

    bar((void* const &)this);

    void bar(void* const & p) {}

(事实上,根据下面的评论,一旦您更改了函数签名,您 并不 实际上需要强制转换)。这会导致使用 this 的值初始化临时变量并绑定到 barp 参数(感谢 M.M 的解释)。

当然,如果您可以用这种方式更改 bar 的签名,那么您也可以让它接受普通的 void *

    bar(this);

    void bar(void* p) {}

或者,将指针值保存到另一个变量:

    void * t = this;
    bar(t);

请注意,bar 的当前签名意味着它可能会在返回之前更改 t 的值。

this 是纯右值,它不能绑定到非常量左值引用。还有一个关于类型的问题,但值类别是一个问题,所以我们不需要深入探讨。

你必须这样写:

void *ptr = this;
bar(ptr);

void *& 的函数签名表明该函数可能会更改其参数。对象的地址无法更改,因此这表明该函数没有按照您的想法执行,或者您对该函数的效果有一些误解。