struct constRef
{
int const & _t;
constRef( int const & ro) : _t( ro) { }
constRef( constRef const & rxo) : _t( rxo._t) { }
int const & t( ) const { return _t; }
static constRef Make( int const & t) { return t; }
} ;
struct Ref
{
int & _t;
Ref( int & ro) : _t( ro) { }
Ref( Ref const & rxo) : _t( rxo._t) { }
operator constRef( ) const { return constRef( _t) ; }
int & t( ) { return _t; }
static Ref Make( int & t) { return t; }
} ;
int main( )
{
int foo = 5 ;
Ref foo2( foo) ;
constRef r( foo2) ; // non-const -> const This compiles.
constRef c( r) ; // const -> const This compiles.
Ref other = Ref:: Make ( foo) ; // non-const -> non-const This compiles
Ref bar( r) ; // const -> non-const This fails to compile
return 0 ;
}
int & MakeRef( int & t) { return t; }
int main2( )
{
int foo = 5 ;
const int & r( foo) ; // non-const -> const
const int & c( r) ; // const -> const This compiles.
int & other = MakeRef( foo) ; // non-const -> non-const This compiles.
int & bar( r) ; // const -> non-const This fails to compile.
return 0 ;
}
c3RydWN0IGNvbnN0UmVmCnsKICAgIGludCBjb25zdCYgX3Q7CiAgICBjb25zdFJlZihpbnQgY29uc3QmIHJvKSA6IF90KHJvKSB7fQogICAgY29uc3RSZWYoY29uc3RSZWYgY29uc3QmIHJ4bykgOiBfdChyeG8uX3QpIHt9CiAgICAKICAgIGludCBjb25zdCAmIHQoKSBjb25zdCB7IHJldHVybiBfdDsgfQogICAgc3RhdGljIGNvbnN0UmVmIE1ha2UoaW50IGNvbnN0ICYgdCkgeyByZXR1cm4gdDsgfQp9OwoKc3RydWN0IFJlZgp7CiAgICBpbnQmIF90OwogICAgUmVmKGludCYgcm8pIDogX3Qocm8pIHt9CiAgICBSZWYoUmVmIGNvbnN0JiByeG8pIDogX3QocnhvLl90KSB7fQogICAgb3BlcmF0b3IgY29uc3RSZWYoKSBjb25zdCB7IHJldHVybiBjb25zdFJlZihfdCk7IH0KICAgIAogICAgaW50JiB0KCkgeyByZXR1cm4gX3Q7IH0KICAgIHN0YXRpYyBSZWYgTWFrZShpbnQmIHQpIHsgcmV0dXJuIHQ7IH0KfTsKCgppbnQgbWFpbigpCnsKICAgIGludCBmb28gPSA1OwogICAgUmVmIGZvbzIoZm9vKTsgICAgICAgICAgICAgICAKICAgIGNvbnN0UmVmIHIoZm9vMik7ICAgICAgICAgICAgLy8gbm9uLWNvbnN0IC0+IGNvbnN0ICAgICAgICAgVGhpcyBjb21waWxlcy4KICAgIGNvbnN0UmVmIGMocik7ICAgICAgICAgICAgICAgLy8gY29uc3QgLT4gY29uc3QgICAgICAgICAgICAgVGhpcyBjb21waWxlcy4KICAgIFJlZiBvdGhlciA9IFJlZjo6TWFrZShmb28pOyAgLy8gbm9uLWNvbnN0IC0+IG5vbi1jb25zdCAgICAgVGhpcyBjb21waWxlcwogICAgUmVmIGJhcihyKTsgICAgICAgICAgICAgICAgICAvLyBjb25zdCAtPiBub24tY29uc3QgICAgICAgICBUaGlzIGZhaWxzIHRvIGNvbXBpbGUKCiAgICByZXR1cm4gMDsKfQoKaW50JiBNYWtlUmVmKGludCYgdCkgeyByZXR1cm4gdDsgfQoKaW50IG1haW4yKCkKewogICAgaW50IGZvbyA9IDU7CiAgICBjb25zdCBpbnQmIHIoZm9vKTsgICAgICAgICAgLy8gbm9uLWNvbnN0IC0+IGNvbnN0CiAgICBjb25zdCBpbnQmIGMocik7ICAgICAgICAgICAgLy8gY29uc3QgLT4gY29uc3QgICAgICAgICAgVGhpcyBjb21waWxlcy4KICAgIGludCYgb3RoZXIgPSBNYWtlUmVmKGZvbyk7ICAvLyBub24tY29uc3QgLT4gbm9uLWNvbnN0ICBUaGlzIGNvbXBpbGVzLgogICAgaW50JiBiYXIocik7ICAgICAgICAgICAgICAgIC8vIGNvbnN0IC0+IG5vbi1jb25zdCAgICAgIFRoaXMgZmFpbHMgdG8gY29tcGlsZS4KCiAgICByZXR1cm4gMDsKfQo=
compilation info
prog.cpp: In function ‘int main()’:
prog.cpp:30:14: error: no matching function for call to ‘Ref::Ref(constRef&)’
prog.cpp:30:14: note: candidates are:
prog.cpp:15:5: note: Ref::Ref(const Ref&)
prog.cpp:15:5: note: no known conversion for argument 1 from ‘constRef’ to ‘const Ref&’
prog.cpp:14:5: note: Ref::Ref(int&)
prog.cpp:14:5: note: no known conversion for argument 1 from ‘constRef’ to ‘int&’
prog.cpp: In function ‘int main2()’:
prog.cpp:43:15: error: invalid initialization of reference of type ‘int&’ from expression of type ‘const int’
prog.cpp:41:16: warning: unused variable ‘c’ [-Wunused-variable]
prog.cpp:42:10: warning: unused variable ‘other’ [-Wunused-variable]
prog.cpp:43:10: warning: unused variable ‘bar’ [-Wunused-variable]
stdout