为什么 GCC 拒绝 std::optional 的引用?

Why GCC rejects std::optional for references?

std::optional<int&> xx; 只是没有针对最新的 gcc-7.0.0 快照进行编译。 C++17 标准是否包括 std::optional 以供参考?为什么不呢? (我猜在专用专业化中使用指针的实现不会造成任何问题。)

在[可选]中:

A program that necessitates the instantiation of template optional for a reference type, or for possibly cv-qualified types in_place_t or nullopt_t is ill-formed.

没有std::optional<T&>。现在,您必须使用 std::optional<std::reference_wrapper<T>>

因为 optional,按照 C++17 中的标准,不允许引用类型。这被设计排除了。

这有两个原因。首先,从结构上讲,optional<T&> 等同于 T*。他们可能有不同的界面,但他们做的是一样的。

第二件事是标准委员会实际上没有就 optional<T&> 应该如何表现的问题达成共识。

考虑以下几点:

optional<T&> ot = ...;
T t = ...;
ot = t;

最后一行应该做什么?它是否获取 ot 引用的对象并复制分配给它,这样 *ot == t?或者它应该重新绑定存储的引用本身,这样 ot.get() == &t?更糟的是,它会在赋值之前吗?

有些人会期望它做一件事,有些人会期望它做另一件事。所以无论你选择哪一方,都会有人感到困惑。

如果您使用的是 T*,那么会发生什么情况就很清楚了:

T* pt = ...;
T t = ...;
pt = t;   //Compile error. Be more specific.
*pt = t;  //Assign to pointed-to object.
pt = &t;  //Change pointer.