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.

Reply via email to