The following program
#include <optional>
#include <iostream>
int main()
{
std::optional<int> a;
constexpr bool x = true;
const std::optional<int> & b = x ? a : std::nullopt;
std::cout << (&a == &b);
const std::optional<int> & c = x ? a : (const std::optional<int> &)std::nullopt;
std::cout << (&a == &c);
const std::optional<int> & d = x ? a : (const std::optional<int>)std::nullopt;
std::cout << (&a == &d);
}
prints 010 even in case of compiler optimization:
https://gcc.godbolt.org/z/asTrzdE3c
Could you please explain why it is so, and what is the difference between seemingly identical 3 cases?