https://gcc.gnu.org/bugzilla/show_bug.cgi?id=67906

--- Comment #7 from Jonathan Wakely <redi at gcc dot gnu.org> ---
I don't think this is a useful enhancement request as currently written.

What are the precise semantics of the new warning that you want? Which cases
should warn, and which should not?

"std::move with no effect" is not clear enough, because the intended effect of
std::move is simply to cast to an rvalue, and it always does that. A type that
only has a copy constructor and no move constructor could be used in generic
code, where that case "has no effect" but that doesn't mean it should warn e.g.

struct A {
  A { }
  A(const X&) { }
};

template<typename T> struct identity { using type = T; };

template<typename T>
bool f(typename identity<T>::type&& t)
{
  T other = std::move(t);
  /* ... */
  return true;
}

A a;
bool b = f<A>(a);

This presumably shouldn't warn.

Should there be a warning for the following code?

struct X {
  X() { }
  X(const X&) { }
  X(const X&&) { }
};

const X x;
const X y = std::move(x);

Although constructors taking a const rvalue reference are rare and not useful
in practice, this code has entirely well-defined meaning. Should there be a
warning?

Reply via email to