On 30 November 2010 20:33, Roman Kononov wrote: > This is related to http://gcc.gnu.org/ml/gcc/2010-11/msg00623.html > > I write about it again because the following seems too bad: > > $ cat test1.cc > struct X { > X()=default; > X(X&&)=default; > X(X const&)=delete; > //some very large or non-copyable content > }; > > X test() { > X const x={}; > { > //a lot of code where I do not want to modify x [accidentally] > } > return x; > } > > $ g++ -c -std=c++0x test1.cc > test1.cc: In function 'X test()': > test1.cc:13:10: error: use of deleted function 'X::X(const X&)' > test1.cc:4:3: error: declared here
How do you expect to return a non-copyable object by value? You could change it to return std::move(x) but you can't move from a const. > Another related example: > > $ cat test2.cc > struct U { > U(); > U(U&&); > U(U const&); > }; > > struct X { > U const u; > X()=default; > X(X&&)=default; > //100 other members > }; > > X test() { > X a={}; > return a; > } > > $ g++ -c -std=c++0x test2.cc > test2.cc: In function 'X test()': > test2.cc:16:10: error: use of deleted function 'X::X(X&&)' > test2.cc:10:3: error: 'X::X(X&&)' is implicitly deleted because the default > definition would be ill-formed: > test2.cc:10:3: error: non-static data member 'X::u' does not have a move > constructor or trivial copy constructor This clearly tells you what's wrong. > In both examples, g++0x forces removing "const" (in "X const x={};" and > "U const u;") or doing some other ugly things like const_cast. In > general, it is not good to discourage using "const" for a number of > reasons. Additionally, if I have to have constness, I need to add > additional clutter reducing readability. > > Can nothing be done to preserve "const"? Does the Standard really make > this code invalid? Gcc v4.5 was friendlier in this respect. GCC 4.5 did not implement the current C++0x rules. However, that doesn't change the fact you're trying to move from a const object, which is obviously wrong.