演算子に参照修飾子を追加すると、右辺値代入を行う可能性がなくなります
たとえば、次のようにコンパイルします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 は、私が理解するのを助けることができないようです.