Ori*_*ent 22 c++ stl optional c++11 boost-optional
为什么std::optional
(目前std::experimental::optional
在libc ++中)没有引用类型的专门化(与之相比boost::optional
)?
我认为这将是非常有用的选择.
是否有一些对象引用了STL中可能已存在的对象语义?
Nev*_*vin 16
当讨论n3406(提案的第2版)时,一些委员会成员对可选参考文献感到不舒服.在n3527(修订版#3)中,作者决定将可选引用作为辅助提议,以增加获得可选值的机会并将其置于C++ 14中.虽然由于各种其他原因,可选项并未完全进入C++ 14,但委员会并未拒绝可选引用,并且如果有人提出,可以在将来自由添加可选引用.
确实有一些东西可能引用了现有的对象语义.它被称为(const)指针.一个普通的旧非拥有指针.引用和指针之间有三个不同之处:
std::optional
.->
或取消引用*
.这是纯粹的语法糖,可能因为1.指针语法(解除引用和转换为bool)正是std::optional
提供访问值并测试其存在的原因.更新:
optional
是值的容器.与其他容器(vector
例如)一样,它不是为了包含引用而设计的.如果你想要一个可选的引用,使用指针,或者如果你确实需要一个具有类似语法的接口,那么std::optional
为指针创建一个小的(和普通的)包装器.
更新2:至于为什么没有这样的专业化的问题:因为委员会只是选择了它.理由可以在论文的某处找到.这可能是因为他们认为指针足够了.
主要问题std::optional <T&>
是 -optRef = obj
在以下情况下应该做什么:
optional<T&> optRef;
…;
T obj {…};
optRef = obj; // <-- here!
Run Code Online (Sandbox Code Playgroud)
变体:
(&optRef)->~optional(); new (&optRef) optional<T&>(obj)
。*optRef = obj
(UB!optRef
之前)。if (optRef) {do1;} else {do2;}
。每个变体的优点:
始终重新绑定(由boost::optional和n1878 选择):
!optRef
和optRef.has_value()
- 后置条件始终满足时,情况之间的一致性。&*optRef == &obj
optional<T>
在以下方面的一致性:对于通常optional<T>
,如果T::operator=
定义为破坏和构造(并且有人认为它必须无非是对破坏和构造的优化),那么opt = …
事实上的行为类似于(&opt)->~optional(); new (&opt) optional<T&>(obj)
。通过以下方式分配:
T&
在以下方面与 pure 保持一致:对于 pure T&
,ref = …
分配通过(不重新绑定ref
)。optional<T>
在以下方面:用于通常optional<T>
,当opt.has_value()
,opt = …
需要通过分配,不破坏和-构建体(见template <class U> optional<T>& optional<T>::operator=(U&& v)
在n3672和上cppreference.com)。optional<T>
在以下方面与通常的一致性:两者都operator=
至少以某种方式进行了定义。如果为空则绑定,否则分配 - 我看不到真正的好处,恕我直言,只有当 #1 的支持者与 #2 的支持者争论时才会出现这种变体,无论在形式上它更符合要求的字母template <class U> optional<T>& optional<T>::operator=(U&& v)
(但不符合精神,恕我直言)。
无赋值运算符(由n3406选择):
T&
在以下方面与 pure 保持一致:pureT&
不允许重新绑定自身。也可以看看:
恕我直言,提供它是非常好的std::optional<T&>
。然而,模板有一个微妙的问题。如果存在引用,模板参数的处理可能会变得棘手。
正如我们解决模板参数中引用问题的方法一样,我们可以使用 astd::reference_wrapper
来避免std::optional<T&>
. 那么现在就变成了std::optional<std::reference_wrapper<T>>
。但是我建议不要使用这种方法,因为 1)它太冗长了,无法同时编写签名(尾随返回类型为我们节省了一点)和它的使用(我们必须调用std::reference_wrapper<T>::get()
以获得真正的引用),以及 2)大多数程序员已经被指针折磨了,所以这就像一种本能反应,当他们收到一个指针时,他们首先测试它是否为空,所以现在这不是什么大问题。
归档时间: |
|
查看次数: |
10246 次 |
最近记录: |