gpt4 book ai didi

c++ - 编译器是否可以在仅引用一次时隐式 std::move 参数?

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:31:25 24 4
gpt4 key购买 nike

假设我有一个带有 setter 的简单类:

class MyClass
{
public:
void setName(std::string name)
{
_name = std::move(name);
}

private:
std::string _name;
};

我在这里使用 std::move,但是如果我忽略它而只写 _name = name,编译器是否可以隐式 move name 参数,因为它没有在 setter 的其他任何地方使用?它几乎可以被视为赋值表达式中的右值,因为它在其他任何地方都没有被名称引用。

编译器能做到吗?现有的编译器会这样做吗?

最佳答案

在什么之上添加 Nawazsaid .在 as-if 规则下,如果编译器可以证明 move 和复制之间的不同行为是不可观察的,则允许进行 move 。 (我相信这对编译器来说真的很难,除了一些琐碎的类型,因为这些类型无论如何都不存在 move 处理的好处。)

我不知道是否有任何编译器这样做。 (我猜不是!)

据我所知,出于重载决议的目的,将左值视为右值的唯一情况是在 return 语句、throw 表达式和异常声明(即 object 的声明 中的 catch(类型对象))。此外,必须满足一些条件(基本上与复制省略相同)才能发生:

When the criteria for elision of a copy operation are met or would be met save for the fact that the source object is a function parameter, and the object to be copied is designated by an lvalue, overload resolution to select the constructor for the copy is first performed as if the object were designated by an rvalue. [...]

最后要注意的是,上面提到的情况都涉及到构造。他们不像 OP 的问题那样涵盖作业。

关于c++ - 编译器是否可以在仅引用一次时隐式 std::move 参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20420210/

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