【发布时间】:2015-08-31 09:10:20
【问题描述】:
考虑以下代码:
class Base {
public:
int bi;
Base() : bi(100) {std::cout << "\nBase default constructor ...";}
Base(int i) : bi(i) {std::cout << "\nBase int constructor: "<< bi;}
Base(const Base& b) {std::cout << "\nBase copy constructor";}
Base(Base&& b) {std::cout << "\nBase move constructor";}
};
Base getBase() {
cout << "\nIn getBase()";
return Base();
}
int main() {
Base b2(getBase());
Base b3 = Base(2);
Base b4 = getBase();
}
尽管给出了右值,但上述 main 中的构造都没有调用移动构造函数。有没有办法确保调用用户定义的移动构造函数?
这是我得到的:
In getBase()
Base default constructor ...
Base int constructor: 2
In getBase()
Base default constructor ...
Base destructor: 100
Base destructor: 2
Base destructor: 100
【问题讨论】:
-
在其他人给出好的答案之前,请查看en.cppreference.com/w/cpp/utility/move
-
调用移动构造函数被简单地优化掉了。 “复制省略”是你的朋友!
-
看起来
getBase()正在被内联 - 尝试在其自己的翻译单元中构建它,然后进行链接。 -
@TobySpeight这是一个分段错误! -
@Klaus这是我的观点;我怎样才能强制调用移动构造函数? std::move() 是一种方法。
标签: c++ c++11 move-constructor