【发布时间】:2016-05-02 12:58:37
【问题描述】:
如果我们有
std::experimental::optional<int> x;
以下行都不编译:
std::experimental::optional<unsigned int> y; y = x;
std::experimental::optional<unsigned int> z(x);
...尽管在我看来就像将int 分配给unsigned int 一样有意义。为什么不应该这样做?也就是说,在这种情况下,如果库不实现复制 ctor 和赋值运算符,可以避免什么陷阱?
【问题讨论】:
-
目前似乎唯一优雅的方式来构造一个可选项是通过move assignment operator。原因是它很可能是所需的行为。该类型还支持通过initializer list 直接(但有点混乱)构造。
-
@DavidPacker:我没有听懂你在说什么......你提供的链接是当前可用的赋值运算符;其中不包括其他可选类型之一。你能解释一下为什么这与搬家任务特别相关吗?
-
抱歉,我没有检查第四步赋值运算符的详细信息。似乎甚至不允许分配不同类型的选项。确实没有任何文档可以证明原因,唯一可以给出答案的可能是负责创建构造的团队成员。
-
好吧,公平地说,这是因为 C++ 语言很棒,但它的标准库却不是。当我理解它的那一刻,我作为 C++ 开发人员的生活变得更加简单和美好。你在抱怨可选吗?我首先要抱怨 2016 年的 IOStream 库、字符串库以及缺乏好的、开箱即用的自上而下的标准库。好消息是,在 C++ 中,你可以自己编写任何东西,而无需等待新标准发布。作为旁注,您可以随时转向 boost-optional 或 facebook folly's optional
-
@DavidHaim:好吧,如果标准库中没有 no 可选选项,那将是一回事,但既然它被采用了,问题仍然是为什么没有实现转换也?如果您认为标准库中的选择通常是不幸的/不合理的/差的,您是否可以链接到某个地方,使该论点更加实质性?
标签: c++ optional c++-standard-library c++17