私のコードは次のとおりです。
#include <iostream>
using namespace std;
class A{
public:
void sendByRvalue(string&& str){
cout << str << endl;
}
};
class B{
private:
A a;
void send(string&& str){
a.sendByRvalue(str);
}
public:
void run(const string& str){
send("run " + str + "\n");
}
};
int main(void){
string str("hello world");
B b;
b.run(str);
return 0;
}
上記のコードをコンパイルすると、いくつかのコンパイル エラーが発生しました。
str
inB::send
関数が lvalue に変更されたようです。次に、の実装を次のB::send
ように変更します。
class B{
private:
A a;
void send(string&& str){
cout << boolalpha << is_rvalue_reference<decltype(str)>::value << endl;
a.sendByRvalue(std::move(str));
}
public:
void run(const string& str){
send("run " + str + "\n");
}
};
すべてうまくいきますが、このプログラムの出力は私をさらに混乱させました。出力は次のとおりです。
パラメーター str が右辺値参照であるのに、引数A::sendByRvalue
なしで直接関数に渡すことができないのはなぜstd::move
ですか?