#include
#include
struct A {
operator A&() && {
return *this;
}
void mutate() {...}
};
< /code>
Это создает предупреждение компилятора, «преобразование» в ссылку на тот же тип никогда не будет использовать преобразование типа ». Но, по крайней мере, оператор составлен и работает, за исключением того, что его необходимо явно вызвать с полным.void f(A& a) { a.mutate(); }
A make_A() { return A{}; }
int main() {
A a;
f(a); // ok
f(make_A().operator A&()); // ok
f(make_A()); // does not compile, implicit conversion to A& doesn't work
f(std::move(a)); // does not compile
}
В C ++ функция с подписью void f (a & a) (не-таковой) связывается только с lvalue. может ли RValue автоматически поднять себя в lvalue?[code]#include #include
struct A { operator A&() && { return *this; } void mutate() {...} }; < /code> Это создает предупреждение компилятора, «преобразование» в ссылку на тот же тип никогда не будет использовать преобразование типа ». Но, по крайней мере, оператор составлен и работает, за исключением того, что его необходимо явно вызвать с полным.void f(A& a) { a.mutate(); }
A make_A() { return A{}; }
int main() { A a;
f(a); // ok f(make_A().operator A&()); // ok f(make_A()); // does not compile, implicit conversion to A& doesn't work f(std::move(a)); // does not compile } [/code] https://godbolt.org/z/okm8n5z1e Есть ли улов или обходной путь для достижения этого?