Affected subclause: [class.copy.elision]
Change: A function returning an implicitly movable entity
may invoke a constructor taking an rvalue reference to a type
different from that of the returned expression
. Function and catch-clause parameters can be thrown using move constructors
. Rationale: Side effect of making it easier to write
more efficient code that takes advantage of moves
. Effect on original feature: Valid C++ 2017 code may fail to compile or have different semantics
in this revision of C++
. For example:
struct base {
base();
base(base const &);
private:
base(base &&);
};
struct derived : base {};
base f(base b) {
throw b;
derived d;
return d;
}
struct S {
S(const char *s) : m(s) { }
S(const S&) = default;
S(S&& other) : m(other.m) { other.m = nullptr; }
const char * m;
};
S consume(S&& s) { return s; }
void g() {
S s("text");
consume(static_cast<S&&>(s));
char c = *s.m;
}