: 
class Thing {
public:
  Thing();
  ~Thing();
  Thing(const Thing&);
};
Thing f() {
  Thing t;
  return t;
}
Thing t2 = f();
struct A {
  void *p;
  constexpr A(): p(this) {}
};
constexpr A g() {
  A loc;
  return loc;
}
constexpr A a;          
constexpr A b = g();    
void h() {
  A c = g();            
}
 
Here the criteria for elision can eliminate
the copying of the object 
t with automatic storage duration
into the result object for the function call 
f(),
which is the global object 
t2.Effectively, the construction of the local object 
t
can be viewed as directly initializing the global object 
t2,
and that object's destruction will occur at program exit
.Adding a move constructor to 
Thing has the same effect, but it is the
move construction from the object with automatic storage duration to 
t2 that is elided
. — 
end example