次の関数 (私の意図では) は、右辺値を取り、それを左辺値として提示することです。
auto constexpr RtoL = [](auto&& r) -> decltype(auto) {
static_assert(std::is_rvalue_reference_v<decltype(r)>, "Gimme rvalues, not lvalues.");
return (r);
};
xvalue が本当に移動されていないことを保証できる状況で使用することを考えています (たとえば、 を介して rvalue にキャストされましたstd::move
が、それを利用したものは何もありません)。そのため、prvalues ではなく xvalues で呼び出します。
とにかく、コンパイラ (GCC のバージョン) は、上記のコードの有効性について異なる意見を持っているようです。具体的には、この使用法を考えると:
int main() {
int x{3};
RtoL(std::move(x));
}
GCC 11.2 では無効と見なされます。
<source>:9:14: error: cannot bind rvalue reference of type 'int&&' to lvalue of type 'int'
9 | return (r);
| ^
一方、GCC 10.3 およびその他のコンパイラは有効と見なします。
さらに、return ステートメントを
return (r);
に
return static_cast<decltype(r)&>(r);
コードが正しいことに全員が同意するようにします。
標準的な観点から言えば、真実はどこにあるのでしょうか。