#include <algorithm>
#include <iostream>
template < typename T>
struct A {
A( std:: size_t size)
: size_( size) ,
t_( new T[ size] ) {
}
~A( ) {
delete [ ] t_;
}
A( const A & a) {
t_ = new T[ a.size_ ] ;
std:: copy ( a.t_ , a.t_ + a.size_ , t_) ;
}
A( A && a) {
t_ = a.t_ ;
size_ = a.size_ ;
a.t_ = 0 ;
}
A& operator = ( A a) {
// unified assignment operator, only need one assignment operator
// If the value is passed as rvalue, the move ctor will be invoked
// If the value is passed as lvalue, the copy ctor will be invoked
swap( * this , a) ;
return * this ;
}
T& operator [ ] ( size_t element) {
return t_[ element] ;
}
const T& operator[ ] ( size_t element) const {
return t_[ element] ;
}
size_t size( ) {
return size_;
}
private :
friend void swap( A & first, A & second) {
// custom swap function, used to reduce code duplication
std:: swap ( first.t_ ,second.t_ ) ;
std:: swap ( first.size_ , second.size_ ) ;
}
T * t_;
std:: size_t size_;
} ;
template < typename T>
struct B {
B( A< T> a1, A< T> a2)
: a1_( a1) ,
a2_( a2) {
}
B( const B& b)
: a1_( b.a1_ ) ,
a2_( b.a2_ ) {
}
B( B && b)
: a1_( std:: move ( b.a1_ ) ) ,
a2_( std:: move ( b.a2_ ) ) {
}
B& operator = ( B b) {
// unified assignment operator, only need one assignment operator
// If the value is passed as rvalue, the move ctor will be invoked
// If the value is passed as lvalue, the copy ctor will be invoked
swap( * this , b) ;
return * this ;
}
private :
friend void swap( B & first, B& second) {
std:: swap ( first.a1_ , second.a1_ ) ;
std:: swap ( first.a2_ , second.a2_ ) ;
}
A< T> a1_;
A< T> a2_;
} ;
int main( ) {
A< int > c( 3 ) ;
B< int > d( c, c) ;
swap( d, c) ;
}
I2luY2x1ZGUgPGFsZ29yaXRobT4KI2luY2x1ZGUgPGlvc3RyZWFtPgoKdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CnN0cnVjdCBBIHsKCQoJQShzdGQ6OnNpemVfdCBzaXplKSAKCTogc2l6ZV8oc2l6ZSksIAoJICB0XyhuZXcgVFtzaXplXSkgeyAKCX0KCgl+QSgpIHsKCQlkZWxldGVbXSB0XzsKCX0KCglBKGNvbnN0IEEgJmEpIHsKCQl0XyA9IG5ldyBUW2Euc2l6ZV9dOwoJCXN0ZDo6Y29weShhLnRfLCBhLnRfICsgYS5zaXplXywgdF8pOwoJfQoKCUEoQSAmJmEpIHsKCQl0XyA9IGEudF87CgkJc2l6ZV8gPSBhLnNpemVfOwoKCQlhLnRfID0gMDsgCgl9CgoJQSYgb3BlcmF0b3IgPSAoQSBhKSB7CgkJLy8gIHVuaWZpZWQgYXNzaWdubWVudCBvcGVyYXRvciwgb25seSBuZWVkIG9uZSBhc3NpZ25tZW50IG9wZXJhdG9yCgkJLy8gIElmIHRoZSB2YWx1ZSBpcyBwYXNzZWQgYXMgcnZhbHVlLCB0aGUgbW92ZSBjdG9yIHdpbGwgYmUgaW52b2tlZAoJCS8vICBJZiB0aGUgdmFsdWUgaXMgcGFzc2VkIGFzIGx2YWx1ZSwgdGhlIGNvcHkgY3RvciB3aWxsIGJlIGludm9rZWQKCQlzd2FwKCp0aGlzLCBhKTsKCQlyZXR1cm4gKnRoaXM7Cgl9CgoJVCYgb3BlcmF0b3IgW10oc2l6ZV90IGVsZW1lbnQpIHsKCQlyZXR1cm4gdF9bZWxlbWVudF07Cgl9CgoJY29uc3QgVCYgb3BlcmF0b3JbXShzaXplX3QgZWxlbWVudCkgY29uc3QgewoJCXJldHVybiB0X1tlbGVtZW50XTsKCX0KCglzaXplX3Qgc2l6ZSgpIHsKCQlyZXR1cm4gc2l6ZV87Cgl9Cgpwcml2YXRlOgoJCglmcmllbmQgdm9pZCBzd2FwKEEgJmZpcnN0LCBBICZzZWNvbmQpIHsKCQkvLyAgY3VzdG9tIHN3YXAgZnVuY3Rpb24sIHVzZWQgdG8gcmVkdWNlIGNvZGUgZHVwbGljYXRpb24JCQoJCXN0ZDo6c3dhcChmaXJzdC50XyxzZWNvbmQudF8pOwoJCXN0ZDo6c3dhcChmaXJzdC5zaXplXywgc2Vjb25kLnNpemVfKTsKCX0KCglUICp0XzsgCglzdGQ6OnNpemVfdCBzaXplXzsKfTsKCnRlbXBsYXRlIDx0eXBlbmFtZSBUPgpzdHJ1Y3QgQiB7CgoJQihBPFQ+IGExLCBBPFQ+IGEyKSAKCTogYTFfKGExKSwgCgkgIGEyXyhhMikgewoKCX0KCglCKGNvbnN0IEImIGIpIAoJOiBhMV8oYi5hMV8pLAoJICBhMl8oYi5hMl8pIHsKCgl9CgoJQihCICYmIGIpIAoJOiBhMV8oc3RkOjptb3ZlKGIuYTFfKSksCgkgIGEyXyhzdGQ6Om1vdmUoYi5hMl8pKSB7CgoJfQoKCUImIG9wZXJhdG9yID0gKEIgYikgewoJCS8vICB1bmlmaWVkIGFzc2lnbm1lbnQgb3BlcmF0b3IsIG9ubHkgbmVlZCBvbmUgYXNzaWdubWVudCBvcGVyYXRvcgoJCS8vICBJZiB0aGUgdmFsdWUgaXMgcGFzc2VkIGFzIHJ2YWx1ZSwgdGhlIG1vdmUgY3RvciB3aWxsIGJlIGludm9rZWQKCQkvLyAgSWYgdGhlIHZhbHVlIGlzIHBhc3NlZCBhcyBsdmFsdWUsIHRoZSBjb3B5IGN0b3Igd2lsbCBiZSBpbnZva2VkCgkJc3dhcCgqdGhpcywgYik7CgkJcmV0dXJuICp0aGlzOwoJfQoKcHJpdmF0ZToKCglmcmllbmQgdm9pZCBzd2FwKEIgJmZpcnN0LCBCJiBzZWNvbmQpIHsKCQlzdGQ6OnN3YXAoZmlyc3QuYTFfLCBzZWNvbmQuYTFfKTsKCQlzdGQ6OnN3YXAoZmlyc3QuYTJfLCBzZWNvbmQuYTJfKTsKCX0KCglBPFQ+IGExXzsKCUE8VD4gYTJfOwoKfTsKCmludCBtYWluKCkgewogICAgQTxpbnQ+IGMoMyk7CiAgICBCPGludD4gZChjLCBjKTsKICAgIHN3YXAoZCwgYyk7Cn0=
compilation info
prog.cpp: In function 'int main()':
prog.cpp:104:14: error: no matching function for call to 'swap(B<int>&, A<int>&)'
prog.cpp:91:14: note: candidates are: void swap(B<int>&, B<int>&)
prog.cpp:50:14: note: void swap(A<int>&, A<int>&)
stdout