はVS2015でいくつかのコードである:ケース3内rvalue参照引数は、rvalue参照パラメータのconst lvalue参照よりも好きなのはなぜですか?ここ
class Elem
{
public:
Elem(int i) : a(i) {}
Elem(Elem && other) = default;
Elem(const Elem & other) = default;
private:
int a;
};
int main()
{
std::vector<Elem> vv;
// case 0
vv.push_back(Elem{ 0 }); // call push_back(Elem &&);
// case 1
Elem e1{ 1 };
vv.push_back(e1); // call push_back(const Elem &);
// case 2
Elem e2{ 2 };
auto & lref = e2;
vv.push_back(lref); // call push_back(const Elem &);
// case 3
Elem e3{ 3 };
auto && rref = std::move(e3);
vv.push_back(rref); // call push_back(const Elem &);
// case 4
Elem e4{ 4 };
vv.push_back(std::move(e4)); // call push_back(Elem &&);
return 0;
}
、rref
のタイプは、右辺値リファレンスであり、その値カテゴリはlvalue
あり、push_back(const Elem &)
を呼び出します。ケース4では
は、効果的な現代のC++項目23によれば、std::move
の実装はstd::move(e4)
のタイプElem &&
であり、その値カテゴリはprvalue
で、push_back(Elem &&)
を呼び出し
// C++ 14
template<typename T>
decltype(auto) move(T&& param)
{
using ReturnType = remove_reference_t<T>&&;
return static_cast<ReturnType>(param);
}
ようなものです。式の型と値カテゴリを行い、実際にT
、const T &
とT &&
間のオーバーロードの解決時に何をすべきか
のでlvalue
T&&
の試合const T &
、およびprvalue
T&&
の試合T&&
、?
申し訳ありませんが、私の問題を明確に記述していません。非常に多くのリンクによると、引数の値カテゴリがprvalue
であれば、T&&
の関数が呼び出されます。値カテゴリがlvalue
の場合は、const T &
の関数が呼び出されます。
パラメータの型が参照のときに、値のカテゴリが参照結合についてチェックされている間に、引数の型がオーバーロード解決に使用されていると言うことはできますか?
変数に名前が付いたらすぐに左辺値 –
http://stackoverflow.com/a/18766736/390913 – perreal