C++11のお話。
RVO(Return Value Optimization)と右辺値参照が競合する場合は、
RVOが優先される。
#include <iostream>
class test
{
public:
test(void) : val(0)
{
std::cout << "ctor with no args" << std::endl;
}
~test(void)
{
std::cout << "dtor : " << val << std::endl;
}
test(int a) : val(a)
{
std::cout << "ctor : " << a << std::endl;
}
test(const test &) = delete; // undef copy constructor
test(test &&a) : val(a.val)
{
std::cout << "move ctor : " << val << std::endl;
a.val = -val;
}
const test& operator=(test &&a)
{
std::cout << "move oper= " << a.val << std::endl;
val = a.val;
a.val = -val;
return *this;
}
private:
int val;
};
test ret_test(int a)
{
test t(a);
return t;
}
int main(void)
{
{
test t1 = ret_test(1); // RVO
t1 = ret_test(2); // rvalue reference
}
std::cout << "---" << std::endl;
{
test t3 = std::move(ret_test(3)); // rvalue reference by std::move
}
return 0;
}
処理した結果は次のようになる。g++ ver.4.7.2 と Debian clang version 3.0-6.2
のどちらでも同じ結果となった。
ctor : 1
ctor : 2
move oper= 2
dtor : -2
dtor : 2
---
ctor : 3
move ctor : 3
dtor : -3
dtor : 3
0 件のコメント :
コメントを投稿