私はstd::forward
と混同していると思います。 std::forward
を使用している私の機能は以下のとおりですが、説明を簡単にするためには大幅に簡略化され修正されています。なぜstd :: forwardはlvalueとrvalueをrvalue参照に変換しますか?
// This is an example code to explain my question simply.
template <typename Element>
void add(Element&& element) {
static std::vector vec;
vec.push_back(std::forward<Element>(element));
}
上記の機能で2つ試しましたが、ケース1のlvalue引数とケース2のrvalue引数
ケース1:左辺値引数
auto some_class = SomeClass();
add(some_class);
ケース2:デバッガで右辺引数
add(SomeClass());
両方のケースは同じで、次の部分、std::forward
部とstd::vector
部を通過します。
std::forward
一部:
template<typename _Tp>
constexpr _Tp&&
forward(typename std::remove_reference<_Tp>::type& __t) noexcept
{ return static_cast<_Tp&&>(__t); }
std::vector
一部:
#if __cplusplus >= 201103L
void
push_back(value_type&& __x)
{ emplace_back(std::move(__x)); }
static_cast<_Tp&&>
を使用しているためstd::forward
部分は、右辺値参照、&&
に両方のケースを変換ようです。 std::vector
はstd::move()
を使用しているため、両方の要素を基準値として扱います。
ケース1は、独自の名前を持っているため、ケース2はrvalueであるため、lvalueは独自の名前を持たないため、補数が必要です。 私はまた、std::forward
がケース1を左辺参照に変換し、ケース2を右辺参照に変換すると予想しています。 lvalue、rvalue、std::forward
についての私の理解は正しいですか?その場合、なぜstd::forward
が両方とも参照値参照として変換されるのは、&&
です。
私が間違えた場合は、お時間を頂戴して申し訳ありません。
お返事ありがとうございます。私は上記の質問が奇妙であることに同意します。私は自分のコードをもう一度読んだ。もう一度ありがとうございます。 – mora