std::optional<int&> xx;
只是没有为最新的gcc-7.0.0快照编译。 C ++ 17标准是否包含std::optional
用于引用?如果它没有?为什么? (在专门的专业化中使用指针的实现不会引起任何问题。)
答案 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_t
或nullopt_t
的程序格式不正确。
没有std::optional<T&>
。目前,您必须使用std::optional<std::reference_wrapper<T>>
。