gpt4 book ai didi

c++ - 在右值方法中从 *this 移动?

转载 作者:可可西里 更新时间:2023-11-01 16:18:32 25 4
gpt4 key购买 nike

在 C++11 中,方法可以根据表示调用方法的对象的表达式是左值还是右值来重载。如果我从通过右值调用的方法返回 *this,我是否需要从 *this 显式地移动

Foo Foo::method() &&
{
return std::move(*this); // Is this move required or not?
}

不幸的是,我不能简单地在我的编译器上测试它,因为 g++ 还不支持这个特性:(

最佳答案

*this 的类型总是一个左值:

§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

下面的代码片段表明:

#include <iostream>
#include <utility>

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

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(我知道的唯一实现引用限定符的编译器),我得到以下输出:

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

关于c++ - 在右值方法中从 *this 移动?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3028632/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com