No. Consider:
using X = std::shared_ptr<int>;
void g(X);
void f() {
X b = std::make_shared<int>();
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::lock_guard<std::mutex>>;
std::mutex i_mutex;
int i;
void g(X);
void f() {
X b = std::make_shared<std::lock_guard<std::mutex>>(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
.
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…