把它变成无效*&

时间:2016-04-05 07:23:05

标签: c++ casting parameter-passing this void-pointers

我有一个接受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) {}
          ^

2 个答案:

答案 0 :(得分:3)

this是一个prvalue,它不能绑定到非const左值引用。关于类型还存在一个问题,但是值类别是一个showstopper,所以我们不需要进入。

你必须写下这样的东西:

void *ptr = this;
bar(ptr);

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

答案 1 :(得分:2)

正如您对问题的评论中所建议的那样,您可以使用const资格认证(因为this实际上是const) - 但是对于演员和参数都需要它:< / p>

    bar((void* const &)this);

    void bar(void* const & p) {}

(事实上,根据下面的评论,一旦你更改了功能签名,你实际上需要演员表)。这会导致使用this的值初始化临时值并绑定到p的{​​{1}}参数(感谢M.M.的解释)。

当然,如果您可以通过这种方式更改bar的签名,那么您也可以接受简单的bar

void *

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

    bar(this);

    void bar(void* p) {}

请注意, void * t = this; bar(t); 的当前签名意味着它可能会在返回之前更改bar的值。