【发布时间】:2016-08-12 06:42:54
【问题描述】:
我想知道这里发生了什么:
class Test {
public:
Test() { std::cout << "Constructor" << std::endl; }
Test(const Test &) { std::cout << "Copy" << std::endl; }
Test(const Test &&) { std::cout << "Move" << std::endl; }
~Test() { std::cout << "Destructor" << std::endl; }
};
std::vector<Test> getTestVektor() {
std::vector<Test> TestVektor(1);
return TestVektor;
}
Test getTest() {
Test TestVariable;
return TestVariable;
}
int main() {
{
std::vector<Test> TestVektor = getTestVektor();
}
std::cout << std::endl;
{
Test TestVarible = getTest();
}
std::cout << std::endl;
{
std::vector<Test> TestVektor(1);
std::vector<Test> TestVektor2 = TestVektor;
}
return 0;
}
使用 VisualStudio 2012 编译:
Constructor
Destructor
Constructor
Move
Destructor
Destructor
Constructor
Copy
Destructor
Destructor
可以用复制省略来解释第一种情况。但这与调用移动构造函数的第二种情况相反。
另一种解释是,函数中的 std::vector 释放其内容并将其传递给第二个 std::vector,因此没有调用复制构造函数。但第三种情况表明,情况并非如此。
那么,这里发生了什么?或者这只是一个疯狂的编译器优化?
【问题讨论】:
-
熟悉“命名返回值优化”吗? (我同意它也应该适用于情况 #2)
-
复制/移动赋值运算符在哪里?
-
@BenVoigt 是的。显然向量的移动构造函数是重点......
-
@xaxxon 似乎我的编译器隐含地声明了它们......
-
@xaxxon 这是copy initialization