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 == &objoptional<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 次 |
| 最近记录: |