首先,您必须了解三元运算符结果的类型是什么。
x ? a : std::nullopt;
这a
是可以引用的变量,并且std::nullopt
是隐式转换为匹配类型的可选内容(此处std::optional<int>
)。因此,转换std::nullopt
以创造临时价值而告终。匹配类型a
也被复制。
因此,三元运算符将 type 推导出为类型的值,std::optional<int>
该值成为临时对象。的新实例std::optional<int>
已创建。
现在const auto &
能够延长临时工的寿命。b
参考std::optional<int>
哪个是延长寿命的暂时性也是如此。
d
是相同的场景,但更明确。
c
具有(const std::optional<int> &)std::nullopt
创建std::optional<int>
具有延长寿命的临时对象。这里三元运算符的参数是什么std::optional<int>&
,const std::optional<int>&
因此它能够传递第一个参数引用返回类型。
查看cppinsights使用您的代码生成的内容:
#include <optional>
#include <iostream>
int main()
{
std::optional<int> a = std::optional<int>();
constexpr const bool x = true;
const std::optional<int> & b = x ? std::optional<int>(a) : std::optional<int>(std::nullopt_t(std::nullopt));
std::cout.operator<<((&a == &b));
const std::optional<int> & c = x ? a : static_cast<const std::optional<int>>(std::optional<int>(std::nullopt_t(std::nullopt)));
std::cout.operator<<((&a == &c));
const std::optional<int> & d = (x ? std::optional<int>(a) : static_cast<const std::optional<int>>(std::optional<int>(std::nullopt_t(std::nullopt))));
std::cout.operator<<((&a == &d));
}