gpt4 book ai didi

C++ 习语 : How can an rvalue be passed around as rvalue?

转载 作者:太空狗 更新时间:2023-10-29 20:33:01 27 4
gpt4 key购买 nike

以下代码无法编译。 Clang 给出此错误消息:候选函数不可行:第一个参数没有从“A”到“A &&”的已知转换

这就好像 f() 中的 a 是一个左值。

struct A{};

void g(A&& a){
return;
}

void f(A&& a){
g(a);
}

int main(){
return 0;
}

这是合理的,因为可以防止 f() 多次调用 g()

以下将修复我的代码:

g(std::move(a)); 

但我看错了:想想如果有人将 f() 的签名修改为 void f(A& a) 会发生什么。

还有更好的成语吗?

最佳答案

but looks wrong at me: think what happens if someone modifies the signature of f() to void f(A& a).

根据参数的值类别更改函数签名是一项重大更改,可能需要手动检查该函数的每次调用。您找不到神奇地适应这种变化的 C++ 习惯用法。

“修复”g(std::move(a)) 是保留函数参数右值性的正确方法。如果 g 应该对右值进行操作,请坚持使用它。如果您后来决定 g 接受右值没有意义,但您想传递一个左值,请重构它 - 并调整调用。在这种特殊情况下,编译器会帮助您,因为它拒绝将右值绑定(bind)到函数参数 A& a

关于C++ 习语 : How can an rvalue be passed around as rvalue?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57971034/

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