我有以下的类
如果省略对
我在gcc和clang上尝试过这个代码。为什么这两个函数调用会以不同的方式处理它们的参数?我错过了什么吗?
class widget {
// The methods only print their name, i.e. c'tor, destructor etc.
public:
widget();
widget(const widget&);
widget(widget&&);
~widget();
auto operator=(const widget&) -> widget&;
auto operator=(widget&&) -> widget&;
};
我在下面的代码中使用了它
#include "widget.h"
auto main() -> int {
widget c(std::move(widget()));
c = std::move(widget());
return 0;
};
这里的行为对我来说很容易理解。在第一次调用中,构造了一个小部件(widget),然后调用移动构造函数,并在临时小部件上调用析构函数。
第二次调用做了同样的事情,但是调用的是移动赋值运算符而不是移动构造函数。离开主方法时,在c上调用了析构函数。
现在来到有趣的部分:
#include "widget.h"
auto main() -> int {
widget c((widget()));
c = widget();
return 0;
};
如果省略对
std::move
的调用,第一种情况将停止工作,并且只会导致一个构造函数调用。而第二种情况仍然像以前一样工作。我在gcc和clang上尝试过这个代码。为什么这两个函数调用会以不同的方式处理它们的参数?我错过了什么吗?
(widghet())
是一个 prvalue,即 rvalue,因此如果可能的话它会被移动。std::move
并不会移动,它只是改变表达式的值类别。如果该表达式已经具有相应的值类别,则它是多余的。 - Columbo-fno-elide-constructors
进行编译。您的副本正在被省略(仅当c
由不被引用指定的临时变量初始化时才有效)。 - David G