我有一个接受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) {}
^
答案 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
的值。