加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c – 从*值转换为rvalue方法?

发布时间:2020-12-16 07:52:13 所属栏目:百科 来源:网络整理
导读:在C 11中,方法可以重载,表示方法被调用的对象的表达式是否为左值或右值.如果我从一个通过rvalue调用的方法返回*,我需要明确地从*这个或者不是? Foo Foo::method() { return std::move(*this); // Is this move required or not?} 不幸的是,我不能简单地测试
在C 11中,方法可以重载,表示方法被调用的对象的表达式是否为左值或右值.如果我从一个通过rvalue调用的方法返回*,我需要明确地从*这个或者不是?
Foo Foo::method() &&
{
    return std::move(*this);   // Is this move required or not?
}

不幸的是,我不能简单地测试这个在我的编译器,因为g不支持这个功能:(

解决方法

这个类型总是一个左派:

§9.3.2[class.this] p1

In the body of a non-static (9.3) member function,the keyword this is a prvalue expression whose value is the address of the object for which the function is called. The type of this in a member function of a class X is X*. […]

§5.3.1[expr.unary.op] p1

The unary * operator performs indirection: the expression to which it is applied shall be a pointer to an object type,or a pointer to a function type and the result is an lvalue referring to the object or function to which the expression points.

所以你需要std :: move如果你想调用move构造函数.

以下代码片段显示:

#include <iostream>
#include <utility>

struct test{
  test(){}
  test(test const&){ std::cout << "copy ctor // #1n"; }
  test(test&&){ std::cout << "move ctor // #2n"; }

  test f_no_move() &&{ return *this; }
  test f_move() &&{ return std::move(*this); }
};

int main(){
  test().f_no_move(); // #1
  test().f_move(); // #2
}

使用Clang 3.1(我知道实现ref-qualifiers的唯一编译器),我得到以下输出:

$clang++ -std=c++0x -stdlib=libc++ -pedantic -Wall t.cpp $./a.out copy ctor // #1 move ctor // #2

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读