1

演算子に参照修飾子を追加すると、右辺値代入を行う可能性がなくなります

たとえば、次のようにコンパイルしますg++ -std=c++14 bar.cpp && ./a.out

#include <cstdio>

struct foo
{
    void operator+=(int x) & { printf("%d\n", x+2); }  
};

int main()
{
    foo() += 10;
}

あなたにあげます

$ g++ -std=c++14 bar.cpp && ./a.out
bar.cpp: In function ‘int main()’:
bar.cpp:14:14: error: passing ‘foo’ as ‘this’ argument discards qualifiers [-fpermissive]
   14 |     foo() += 10;
      |              ^~
bar.cpp:6:10: note:   in call to ‘void foo::operator+=(int) &’
    6 |     void operator+=(int x) & { printf("%d\n", x+2); }
      |          ^~~~~~~~

もちろん、明示的に追加することでこれを「修正」できます&&

#include <cstdio>

struct foo
{
    void operator+=(int x) & { printf("%d\n", x+2); }  
    void operator+=(int x) && { printf("%d\n", x+3); }  
};

int main()
{
    foo() += 10;
}

出力

$ g++ -std=c++14 bar.cpp && ./a.out
13

ただし、 a を追加すると、構造体インスタンスconst &を呼び出すこともできます。+=

#include <cstdio>

struct foo
{
    void operator+=(int x) & { printf("%d\n", x+2); }  
    void operator+=(int x) const & { printf("%d\n", x+4); }  
};

int main()
{
    foo() += 10;
}

出力

$ g++ -std=c++14 bar.cpp && ./a.out
14

これを「修正」するには、const &&明示的に削除する必要があります

#include <cstdio>

struct foo
{
    void operator+=(int x) & { printf("%d\n", x+2); }  
    void operator+=(int x) const & { printf("%d\n", x+4); }  
    void operator+=(int x) const && = delete;
};

int main()
{
    foo() += 10;
}

出力

$ g++ -std=c++14 bar.cpp && ./a.out
bar.cpp: In function ‘int main()’:
bar.cpp:14:14: error: use of deleted function ‘void foo::operator+=(int) const &&’
   14 |     foo() += 10;
      |              ^~
bar.cpp:9:10: note: declared here
    9 |     void operator+=(int x) const && = delete;
      |          ^~~~~~~~

どうしてこれなの?ref-qualifier を追加すると、右辺値の割り当てが暗黙的に削除されるのはなぜですか? しかし、ref-qualifier と一緒に cv-qualifier を追加すると、暗黙的に右辺値の割り当てが追加されるように見えますか?

ここで明らかな何かが欠けていると確信しています。しかし、Google-Wan Kenobi は、私が理解するのを助けることができないようです.

4

1 に答える 1