language: C++11 (gcc-4.7.2)
date: 675 days 10 hours ago
link:
visibility: private
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
#include <iostream>
 
#define LAMBDA(x) [&] { return x; }
 
class A
{
public:
  A() : i(42) {};
  A(const A& a) : i(a.i) { std::cout << "Copy "; }
  A(A&& a) : i(a.i) { std::cout << "Move "; }
  int i;
};
 
class B1
{
public:
  B1(const A& a_) : a(a_) {}
  B1(A&& a_) : a(std::move(a_)) {}
  int get_i() { return a.i; }
  A a;
};
 
class B2
{
public:
  B2(const A& a_) : a(a_) {}
  B2(A&& a_) : a(std::move(a_)) {}
  template <class LAMBDA_T>
  B2(LAMBDA_T&& f, decltype(f())* dummy = 0) : a(f()) {}
  int get_i() { return a.i; }
  A a;
};
 
int main()
{
  A a;
  std::cout << "B1 b11(       a ): ";
  B1 b11(a);
  std::cout << "i: " << b11.get_i();
  std::cout << std::endl;
  std::cout << "B2 b12(LAMBDA(a)): ";
  B2 b12(LAMBDA(a));
  std::cout << "i: " << b12.get_i();
  std::cout << std::endl;
  std::cout << std::endl;
 
  std::cout << "B1 b21(       std::move(a) ): ";
  B1 b21(std::move(a));
  std::cout << "i: " << b21.get_i();
  std::cout << std::endl;
  std::cout << "B2 b22(LAMBDA(std::move(a))): ";
  B2 b22(LAMBDA(std::move(a)));
  std::cout << "i: " << b22.get_i();
  std::cout << std::endl;
  std::cout << std::endl;
 
  std::cout << "B1 b31((       A() )): "; 
  B1 b31((A())); 
  std::cout << "i: " << b31.get_i();
  std::cout << std::endl;
  std::cout << "B2 b32((LAMBDA(A()))): ";
  B2 b32((LAMBDA(A())));
  std::cout << "i: " << b32.get_i();
  std::cout << std::endl;
  std::cout << std::endl;
}