comp.std.c++ のこのリンクで、Howard Hinnant 氏は次のコードを示しています。
#include <utility>
#include <cassert>
struct A
{
A() : data_(1) {}
A(A&& a) : data_(a.data_) {a.data_ = 0;}
int data_;
};
void g(const A&) {}
void g(A&& a) {a.data_ = 0;}
void h(const A&) {}
void h(A&& a) {a.data_ = 0;}
void f(A&& a)
{
g(a); // calls g(const A&)
h(a); // calls h(const A&)
if (true)
{
h(a); // calls h(A&&) (by Alexandrescu rules)
}
}
int main()
{
A a;
f(a);
assert(a.data_ == 1);
}
それから彼は書いています:
N1377 規則では、アサートしません。...
実際の C++11 ルールでは、上記のコードはコンパイルa
されmain()
ません。これは、左辺値が右辺値参照にバインドされないためです。しかし、それがコンパイルされたと仮定するだけで、おそらくこの議論が行われたときに想定されていたように、上記の主張、つまりBy the N1377 rules, it does not assert.
. 以前のルールによれば、f(a) で引数として渡されるように、変数は盗まれませんa
か (a.data_ = 0 )?a
f