A code like this is often seen in r-value references articles:
Dave Abrams: Move It With Rvalue References
void g(X);
void f()
{
X b;
g(b);
No. Consider:
using X = std::shared_ptr;
void g(X);
void f() {
X b = std::make_shared();
int &i = *b;
g(b); // last use of 'b'
i = 5;
}
In general, the compiler cannot assume that altering the semantics of copies, moves and destructors of X will be a legitimate change without performing analysis on all the code surrounding the use of b (i.e., the whole of f, g, and all the types used therein).
Indeed, in some cases whole-program analysis may be necessary:
using X = std::shared_ptr>;
std::mutex i_mutex;
int i;
void g(X);
void f() {
X b = std::make_shared>(i_mutex);
g(b); // last use of 'b'
i = 5;
}
If b is moved, this introduces a data race against other threads that synchronize access to i using i_mutex.