4

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 )?af

4

1 に答える 1