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

标签 c++ c++11 compiler-construction move-semantics

假设我有一个带有 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/

相关文章:

c++ - 我对带有增量时间和插值的固定时间步的解决方案是否错误?

c++ - 如何在 Win32 中操作键盘输入?

c++ - 为什么不完整类型的智能指针数据成员和原始指针数据成员在其父级析构时具有不同的行为?

c++11: 委托(delegate)构造函数 - 无法选择构造函数模板?

c++ - 了解 C/C++ 中函数调用的堆栈框架?

c# - Eigen 点到平面算法,返回四元数?

c++ - 将静态 constexpr 类成员分配给运行时变量

C++ 将 2d 数组(由 uniqe_ptr 引用)合并到 3d 数组中

Java:特定枚举和通用 Enum<?> 参数

c# - C# 编译器是否足够智能来优化此代码?