template<class T>
struct V {
V() = default;
V(const T& v): val(v) {};
T val;
};
struct A {
V<int> a;
int b;
};
V<int> wtf(const A& c) {
return c.a;
}
int return_rvalue(const A& c) {
return c.b;
}
int main() {
A c;
wtf(c) = 0xbabe; //< Почему не ругается здесь?
return_rvalue(c) = 0xdead; //< Здесь ругается, как и положено
}
Отловил неожиданную для себя проблему в коде, когда функция возвращается значение по значению, но каким-то образом присвоение этому временному объекту отрабатывает без ошибок, даже без варнингов. Как это вообще возможно? Ниже функция return_rvalue не компилируется, как ей и положено,я ожидал схожего поведения от wtf, но оказался неправ и был жестко наказан: присвоенное значение просто съедалось и исчезало в бездне небытия.
Думал, что проблема из-за implicit конструктора принимающего оборачиваемый тип, убрал его, заменил на перегруженный operator=, все осталось по прежнему.
Прошу помощи зала, спасибо.