为什么我在使用 &this 时出现错误?
Why am I getting an error when using &this?
我知道this
指针在调用成员函数时会隐式传递给它们。然而,当我试图(通过&this
)获取this
指针的地址时,我会得到编译器错误"lvalue required"。为什么会这样?
class st
{
int a,b;
public :
void print()
{
cout << &this; //gives lvalue required... why?
cout << this; //will print address of object.
}
}
this
不是一个左值,而是一个prvalue。来自【class.this】:
在非静态(9.3)成员函数的主体中,关键字这是一个prvalue表达式,其值是为其调用函数的对象的地址。在类X的成员函数中,它的类型是X*。如果成员函数被声明为const,则this的类型为const X*,如果成员函数声明为volatile,则this类型为volatileX*,并且如果成员函数宣布为const volatile则this类型是const volabileX*。
强调矿
&
需要一个lvalue
,因此您无法获得this
的地址。
因为这个指针是一个右值。这个指针是一个常数值,它像局部变量一样传递给成员函数,所以它的值存储在一个内存位置,当从该函数返回时,该内存位置将变为无效。
假设您正试图打印出对象中的值。cout不知道怎么做,你必须教它。cout<lt*这如果cout知道怎么做的话,可能会这样做,但你可以教它。下面是一个更自然的c++例子。(您还应该考虑构造函数)。
#include <iostream>
using namespace std;
class st
{
public:
int a,b;
};
std::ostream& operator<<(std::ostream& s, const st& val)
{
return s << "a:" << val.a << " b:" << val.b ;
}
int main() {
st foo;
foo.a = 1;
foo.b = 2;
cout << "foo is " << foo << endl;
}
相关文章:
- C++错误:"error: int aaa::bbb is protected within this context"
- 类中的数组变量C++导致"was not declared in this scope"实现文件的一个函数中错误,但在构造函数中不会导致错误
- 错误:类没有名为"ThisW"的成员;你是说"这个"吗?但是代码没有说"ThisW",它已经说了"This"
- C++ 中的构造函数、继承、堆栈、堆、this-pointer 和段错误
- C++ Boost - 序列化错误 - 将"const B"作为"this"参数
- 整体模板参数。错误:在常量表达式中使用'this'
- 如何解决"cout was not declared in this scope"错误?
- 从 std::ostream 重载 << 运算符时,为什么编译器会给出"too many parameters for this operator function"错误?
- 即使包含 <time.h 后仍"‘CLOCK_PER_SEC’ was not declared in this scope"错误>
- 使用 boost::序列化代码将 *this 传递给模板函数会产生错误
- С 错误"s1, s2 are used uninitialised in this function"
- 有没有办法绕过错误"因为'this'参数会丢弃限定符?
- 为什么直接传递"this"指针来存档是一个错误,而另一个相同类型的指针是可以的?
- "this" Lambda 捕获的是不正确的。海湾合作委员会编译器错误?
- C++ 中的"this declaration has no storage class or type specifier"错误
- 错误"this declaration has no storage class or type specifier"
- C++ Lambda:访问 lambda 中的静态方法会导致错误'this was not captured for this lambda function'
- 得到错误:' this '对于静态成员函数不可用,即使函数不是静态的
- C++:关键字错误'this'
- c++ 服务正在停止,出现错误"this application has requested the runtime to terminate it an unusual way"