为什么GCC拒绝std :: optional参考?

时间:2016-11-02 14:45:35

标签: c++ gcc reference optional c++17

std::optional<int&> xx;只是没有为最新的gcc-7.0.0快照编译。 C ++ 17标准是否包含std::optional用于引用?如果它没有?为什么? (在专门的专业化中使用指针的实现不会引起任何问题。)

2 个答案:

答案 0 :(得分:9)

因为optional,在C ++ 17中标准化,不允许引用类型。这被设计排除在外。

这有两个原因。首先,从结构上讲,optional<T&>相当于T*。它们可能有不同的接口,但它们也做同样的事情。

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

请考虑以下事项:

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

最后一行应该做什么?是ot引用了对象并对其进行了copy-assign,以便*ot == t?或者它应该重新绑定存储的引用本身,以便ot.get() == &t?更糟糕的是,它会在转让前do different things based on whether ot was engaged or not吗?

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

如果你使用了T*,那么很明显会发生什么:

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

答案 1 :(得分:2)

在[可选]中:

  

需要为参考类型实例化模板的程序,或者可能是cv限定类型in_place_tnullopt_t的程序格式不正确。

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