Tho*_*eod 4 c++ rvalue this-pointer c++11
C++ 标准的第 9.3.2.1 节指出:
在非静态 (9.3) 成员函数的主体中,关键字 this 是一个纯右值表达式,其值是调用该函数的对象的地址。类 X 的成员函数中 this 的类型是 X*。如果成员函数声明为const,则this的类型为const X*,如果成员函数声明为volatile,则this的类型为volatile X*,如果成员函数声明为const volatile,则this的类型为const挥发性 X*。
那么如果this是一个纯右值,它的值类别是*this什么?以下表明即使对象是右值,*this也始终是左值。这样对吗?如果可能,请参考标准。
struct F;
struct test
{
void operator()(F &&) { std::cout << "rvalue operator()" << std::endl; }
void operator()(F const &&) { std::cout << "const rvalue operator()" << std::endl; }
void operator()(F &) { std::cout << "lvalue operator()" << std::endl; }
void operator()(F const &) { std::cout << "const lvalue operator()" << std::endl; }
};
struct F
{
void operator ()()
{
struct test t;
t(*this);
}
};
int main()
{
struct F f;
f();
std::move(f)();
}
Run Code Online (Sandbox Code Playgroud)
输出:
lvalue operator()
lvalue operator()
Run Code Online (Sandbox Code Playgroud)
来自 [basic.lval]:
左值(历史上如此称呼,因为左值可以出现在赋值表达式的左侧)指定一个函数或一个对象。[ 示例: If
E是指针类型的表达式,则*E是指向指向 的对象或函数的左值表达式E。再举一个例子,调用一个返回类型为左值引用的函数的结果是一个左值。—结束示例]
来自 [expr.unary.op]:
一元运算
*符执行间接操作:应用它的表达式应是指向对象类型的指针,或指向函数类型的指针,结果是引用表达式指向的对象或函数的左值。
取消引用一个指针是一个左值。*this左值也是如此。
或者,任何不是左值的都是右值。右值是:
右值(历史上如此称呼,因为右值可能出现在赋值表达式的右侧)是一个 xvalue、一个临时对象 (12.2) 或其子对象,或者一个与对象无关的值。
而且*this绝对不是这些东西。
| 归档时间: |
|
| 查看次数: |
593 次 |
| 最近记录: |