#include <boost/noncopyable.hpp>
#include <memory>
class U { } ;
U* create_T( ) { return new U; }
class T : boost:: noncopyable {
public :
explicit T( U * p) : p_( p) {
}
~T( ) {
delete p_;
}
operator bool ( ) const { return p_ ! = 0 ; }
private :
mutable U * p_;
U* release( ) const { U* r = p_; p_ = 0 ; return r; }
friend class InitT;
} ;
class InitT {
public :
T t;
InitT( const InitT& o) : t( o.t .release ( ) ) { }
InitT( U* u) : t( u) { }
operator bool ( ) const { return t; }
} ;
int main( ) {
T x = new U; // allowed
T y( new U) ; // allowed
std:: auto_ptr < U> a = new U;
std:: auto_ptr < U> b( new U) ;
if ( T i = create_T( ) ) { }
if ( T i( create_T( ) ) ) { }
if ( U* u = create_T( ) ) { T i( u) ; }
if ( InitT i = create_T( ) ) { i.t ; }
//T z = x; // not allowed
//T x2(x) // not allowed
}
I2luY2x1ZGUgPGJvb3N0L25vbmNvcHlhYmxlLmhwcD4KI2luY2x1ZGUgPG1lbW9yeT4KCgpjbGFzcyBVIHt9OwoKVSogY3JlYXRlX1QoKSB7IHJldHVybiBuZXcgVTsgfQoKY2xhc3MgVCA6IGJvb3N0Ojpub25jb3B5YWJsZSB7CnB1YmxpYzoKICAgIGV4cGxpY2l0IFQoVSAqcCkgOiBwXyhwKSB7CiAgICB9CgogICAgflQoKSB7CiAgICAgICAgZGVsZXRlIHBfOwogICAgfQoKICAgIG9wZXJhdG9yIGJvb2woKSBjb25zdCB7IHJldHVybiBwXyAhPSAwOyB9CgoKcHJpdmF0ZToKICAgIG11dGFibGUgVSAqcF87CiAgICBVKiByZWxlYXNlKCkgY29uc3QgeyBVKiByID0gcF87IHBfID0gMDsgcmV0dXJuIHI7IH0KICAgIGZyaWVuZCBjbGFzcyBJbml0VDsKfTsKCmNsYXNzIEluaXRUIHsKcHVibGljOgogIFQgdDsKICBJbml0VChjb25zdCBJbml0VCYgbykgOiB0KG8udC5yZWxlYXNlKCkpIHt9CiAgSW5pdFQoVSogdSkgOiB0KHUpIHt9CiAgb3BlcmF0b3IgYm9vbCgpIGNvbnN0IHsgcmV0dXJuIHQ7IH0KfTsKCmludCBtYWluKCkgewogICAgVCB4ID0gbmV3IFU7IC8vIGFsbG93ZWQKICAgIFQgeShuZXcgVSk7ICAvLyBhbGxvd2VkCiAgICBzdGQ6OmF1dG9fcHRyPFU+IGEgPSBuZXcgVTsKICAgIHN0ZDo6YXV0b19wdHI8VT4gYihuZXcgVSk7CgogICBpZiAoVCBpID0gY3JlYXRlX1QoKSkge30KICAgaWYgKFQgaShjcmVhdGVfVCgpKSkge30KICAgaWYgKFUqIHUgPSBjcmVhdGVfVCgpKSB7IFQgaSh1KTsgfQogICBpZiAoSW5pdFQgaSA9IGNyZWF0ZV9UKCkpIHsgIGkudDsgIH0KCiAgICAvL1QgeiA9IHg7ICAgICAvLyBub3QgYWxsb3dlZAogICAgLy9UIHgyKHgpICAgICAgLy8gbm90IGFsbG93ZWQKfQ==