2016-04-05 73 views
0

我有一个方法接受void*&作为参数,我想通过this作为参数。将其转换为void *&

例子:

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

C++达到合理长度以保证您的安全。你需要一个像@Piotr这样的表达来提供自己在脚下的射击。但要明白,你会*用这样的代码在脚下自我射击。 'bar'有一个签名,意味着它改变了'void *',但是你不能改变'this'。 – MSalters

回答

2

正如你的问题的意见建议,你可以使用一个const资格(因为this是有效const) - 但你需要它同时为演员和参数:

bar((void* const &)this); 

    void bar(void* const & p) {} 

(而事实上,按照下面的评论,你不要一旦你改变功能签名实际上需要演员)。这导致临时初始化值为this并且绑定到bar的参数p(感谢M.M.的解释)。

当然,如果你能以这种方式改变bar签名,那么你不妨让它接受一个普通void *来代替:

bar(this); 

    void bar(void* p) {} 

另外,指针的值保存到另一个变量:

void * t = this; 
    bar(t); 

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

+1

注意:没有理由将'void * const&p'更改为'void * p'。另外,通过对函数签名的更改,您不需要在函数调用中进行强制转换。 –

+0

@ M.M真的很明显,尽管我坚信你需要为特定的转换需要演员阵容,尤其是在IIUC导致潜在严格的混叠违规行为之后。 – davmac

+0

没有混淆违规:它创建了一个从'this'初始化的'void * const'类型的“临时”,并且引用绑定到临时对象。 (引用绑定要么直接绑定要么绑定到一个临时的 - 它不会绑定到“错误的类型”,除非你明确地转换为引用了错误的类型)。所以省略演员实际上删除了通过使用错误的演员造成违反别名的可能性 –

3

this是一个prvalue,它不能绑定到一个非const的左值引用。关于这个类型也有一个问题,但是价值类别是一个炫目的东西,所以我们不需要去讨论。

你将不得不写类似:

void *ptr = this; 
bar(ptr); 

函数签名是void *&表明可能会修改其参数。一个对象的地址是不能改变的,所以这表明这个函数不会做你认为它做的事,或者你对函数的影响有一些误解。

相关问题