У меня есть сценарий, в котором мне нужно преобразовать функцию, которая может быть прикована цепью *this
к возвращению std::optional<std::reference_wrapper<T>>
вместо T&
(причина выходит за рамки этого вопроса). Причина, по которой я использую std::reference_wrapper
, заключается в том, что std::optional
не может получить ссылку, по крайней мере, в C ++ 11. Однако, это не работает, потому что я, кажется, сталкиваюсь с проблемами при жизни. Вот минимальный пример:
#include <iostream>
#include <functional>
struct test {
std::reference_wrapper<test> foo() {
val = 42;
return *this;
}
test& foo2() {
val = 50;
return *this;
}
int val;
};
void bar(test t) {
std::cout << std::move(t).val << "\n";
}
int main()
{
auto f = test().foo();
bar(f);
auto g = test().foo2();
bar(g);
}
Это выводит 0 50
вместо ожидаемого 42 50
. Если я разделю это на два утверждения:
auto f = test();
auto f2 = f.foo();
bar(f2);
Работает как положено. Используя отладчик, я обнаружил, что компилятор оптимизирует некоторые выражения, и val
остается неинициализированным, что заставляет меня думать, что в моем коде есть неопределенное поведение.
Есть ли у меня неопределенное поведение? Если да, то как мне избежать этого здесь?