です:C++ 11右辺値のフィールドは、私はセットアップに多くのクラスのための移動のコンストラクタで使用するために、配列を交換するためのテンプレートをしようとしている右辺値
template <class T> void tools_swap_array(T* & a, T* & b) noexcept
{
auto tmp(a);
a = b;
b = tmp;
}
は、今私はそれを使用したいです)コンストラクタを移動しmove_from(と呼ばれる一般的な方法を介して代入演算子を移動:
valはクラスラベルのフィールドであるvoid label::move_from(label && ref) noexcept
{
tools_swap_array((char *)val, (char*)ref.val);
}
:
class label
{
public:
// [...]
label(label && ref) { move_from(std::move(ref)); };
label & operator = (label && ref) { move_from(std::move(ref)); return *this; };
// [...]
private:
char val[LABEL_SIZE];
};
しかし、私がコンパイラを実行すると、それはref.valがrvalueであることを伝えるmove_from()に失敗します!
error: invalid initialization of non-const reference of type 'char*&'
from an rvalue of type 'char*'
tools_swap_array((char *)val, (char*)ref.val);
^
私は、 "ラベル& & refは"(move_from内部左辺値になります)ので、 "ref.val" だろうと思いました。だから、私はまだrvalueへのC++ 11のリファレンスを誤解していますか、これはコンパイラのバグですか?
ありがとうございました!
は[右辺値](HTTPを生成します。
いずれかの方法で、あなたはこれを行うことができます'val'と同じアドレスを指す' char * '型の.com/w/cpp/language/value_category#rvalue)(一時オブジェクト)非const参照はrvaluesを参照することはできません。コンパイラは '(char *)ref.val'は' ref.val'ではなくrvalueであると言っています。 –
残りの部分を除いて、2つのポインタを任意のサイズの配列の先頭にスワップしても、その配列はまったく変更されません。 – Deduplicator
C++でプログラミングするときは、生ポインタを使用しないでください。これらはまれな例外的なケースのために予約されています。これはおそらくC++標準ライブラリの機能で既に解決されているでしょう。 – user0042