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
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
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.