为什么 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.
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
ornullopt_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.