- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
假设我有一个带有 setter 的简单类:
class MyClass
{
public:
void setName(std::string name)
{
_name = std::move(name);
}
private:
std::string _name;
};
我在这里使用 std::move
,但是如果我忽略它而只写 _name = name
,编译器是否可以隐式 move name
参数,因为它没有在 setter 的其他任何地方使用?它几乎可以被视为赋值表达式中的右值,因为它在其他任何地方都没有被名称引用。
编译器能做到吗?现有的编译器会这样做吗?
最佳答案
在什么之上添加 Nawaz有said .在 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/
我是一名优秀的程序员,十分优秀!