将其转换为 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
的值初始化临时变量并绑定到 bar
的 p
参数(感谢 M.M 的解释)。
当然,如果您可以用这种方式更改 bar
的签名,那么您也可以让它接受普通的 void *
:
bar(this);
void bar(void* p) {}
或者,将指针值保存到另一个变量:
void * t = this;
bar(t);
请注意,bar
的当前签名意味着它可能会在返回之前更改 t
的值。
this
是纯右值,它不能绑定到非常量左值引用。还有一个关于类型的问题,但值类别是一个问题,所以我们不需要深入探讨。
你必须这样写:
void *ptr = this;
bar(ptr);
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
的值初始化临时变量并绑定到 bar
的 p
参数(感谢 M.M 的解释)。
当然,如果您可以用这种方式更改 bar
的签名,那么您也可以让它接受普通的 void *
:
bar(this);
void bar(void* p) {}
或者,将指针值保存到另一个变量:
void * t = this;
bar(t);
请注意,bar
的当前签名意味着它可能会在返回之前更改 t
的值。
this
是纯右值,它不能绑定到非常量左值引用。还有一个关于类型的问题,但值类别是一个问题,所以我们不需要深入探讨。
你必须这样写:
void *ptr = this;
bar(ptr);
void *&
的函数签名表明该函数可能会更改其参数。对象的地址无法更改,因此这表明该函数没有按照您的想法执行,或者您对该函数的效果有一些误解。