
Anthony Williams wrote:
David Abrahams <dave@boost-consulting.com> writes:
I don't see any problem here. There's no problem getting the rvalue out of source(), or sink(source()) would fail. Furthermore, no compiler I've ever seen will actually make the allowed temporary in that case.
How about [...] const X& x=ySource().x;
This strikes me as more likely to cause a copy than a straight-forward binding from an X temporary.
I tried your suggestion on several compliers. EDG and BCC didn't copy. VC copied using the copy ctor. GCC3.2 copied *without* using the copy ctor! <code> extern "C" int printf(const char*, ...); struct X { X() {} X(X const&) { printf("X(X const&)\n"); } }; struct Y { X arr[1000]; X x; ~Y() { printf("~Y(): %p\n", &x); } }; int main() { const X& x = Y().x; printf("X: %p\n", &x); return 0; } #if 0 VC: X(X const&) ~Y(): 0012FF74 X: 0012FB88 GCC: ~Y(): 0x22fec0 X: 0x22fec8 Comeau: X: 0012FE7C ~Y(): 0012FE7C BCC: X: 0012FF84 ~Y(): 0012FF84 #endif