gpt4 book ai didi

c++ - 为什么我不能用 optional 构造 optional (对于 S!=T)?

转载 作者:可可西里 更新时间:2023-11-01 16:37:25 26 4
gpt4 key购买 nike

如果我们有

 std::experimental::optional<int> x;

以下两行都不编译:

 std::experimental::optional<unsigned int> y; y = x;
std::experimental::optional<unsigned int> z(x);

... 尽管在我看来这就像将 int 赋值给 unsigned int 一样有意义。为什么这行不通?也就是说,库没有为这种情况实现复制构造函数和赋值运算符,避免了哪些陷阱?

最佳答案

你不能这样做,因为 std::experimental::optional 没有适当的构造函数和赋值运算符重载。

当然可以提供这样的接口(interface)。事实上,建议的接口(interface)所基于的 boost optional 确实有一个重载的构造函数和赋值运算符,用于从 optional 的另一个实例构造。

proposal ,有一个“与 Boost.Optional 的比较”部分,其中包含一个比较表,其中包括讨论的重载。除了一般性声明外,提案没有给出差异的理由:

The current proposal reflects our arbitrary choice of balance between unambiguousity, genericity and flexibility of the interface.

决定是否包含重载的基本原理在 git repo 中讨论。具有引用实现并在 ISO C++ Standard - Future Proposals 中邮件列表。

在 github 问题中,该提案的作者 Andrzej Krzemieński 展示了过载可能导致的这种有问题的歧义:

It is just not clear what should happen in the following situation:

struct Tool
{
Tool(int); // ctor 1
Tool(optional<int>); // ctor 2
};

optional<int> oi = 1;
optional<Tool> ot = oi;

Which constructor of Tool should be called and why?

关于c++ - 为什么我不能用 optional<S> 构造 optional<T> (对于 S!=T)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36983061/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com