【发布时间】:2021-09-19 01:57:03
【问题描述】:
下面的程序
#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);
}
即使在编译器优化的情况下也会打印010:
https://gcc.godbolt.org/z/asTrzdE3c
能否请您解释一下为什么会这样,看似相同的 3 个案例之间有什么区别?
【问题讨论】:
-
请参阅 条件运算符 en.cppreference.com/w/cpp/language/operator_other,因为它大约有 2 页的“if-this-then-that”
-
作为另一个数据点,如果您直接比较选项(而不是获取它们的地址),它将打印
111 -
通俗地说,三元运算符将返回一个类型的对象,两个操作数都可以隐式转换(这就是为什么它在元函数
std::common_type的幕后使用)。如果两个操作数都是通用类型,您将获得对所选操作数的引用。如果没有,将创建所需类型的临时对象。在您的第一个和第三个示例中就是这种情况。 -
@SergeyA 听起来像是一个答案。
-
@TedLyngmo 我觉得作为一个答案有点缺乏规范,但如果人们认为它有用,我可以发布它。
标签: c++ conditional-operator stdoptional