gpt4 book ai didi

c++ - lvalue-ref-qualified 函数可以直接用在 rvalue-ref-qualified 函数中吗?

转载 作者:行者123 更新时间:2023-12-01 14:42:49 26 4
gpt4 key购买 nike

我一直在编写以下代码来支持对右值的函数调用,而不必 std::move明确地在返回值上。

struct X {
X& do_something() & {
// some code

return *this;
}

X&& do_something() && {
// some code

return std::move(*this);
}};

但这导致不得不重复函数内部的代码。最好,我会做类似的事情
struct X {
X& do_something() & {
// some code

return *this;
}

X&& do_something() && {
return std::move(do_something());
}};

这是一个有效的转变吗?为什么或者为什么不?

另外,我不禁觉得在 ref-qualifiers 方面存在一些知识差距。是否有一种通用方法(或一组规则)来确定这样的代码是否有效?

最佳答案

Is this a valid transformation?



是的。成员函数内部 *this始终是左值。即使该函数是右值引用限定的。这是一样的
void foo(bar& b) { /* do things */ }

void foo(bar&& b) {
// b is an lvalue inside the function
foo(b); // calls the first overload
}

因此,您可以使用左值 ref 限定函数来共享实现。

并使用 std::move结果上也没有问题。第一个重载只能返回一个左值引用,因为据它所知,它是在一个左值上调用的。同时,第二个重载有一点额外的信息,它知道它最初是在一个右值上调用的。因此,它会根据附加信息进行额外的强制转换。
std::move只是将左值转换为右值的命名转换。其目的是指示指定对象可以被视为即将到期。由于您是在您知道这是真的的上下文中执行此转换(该成员最初是在绑定(bind)到右值引用的对象上调用的),所以它不应该造成问题。

关于c++ - lvalue-ref-qualified 函数可以直接用在 rvalue-ref-qualified 函数中吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62017581/

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