为什么GCC拒绝std :: optional参考?

Vah*_*agn 7 c++ gcc reference optional c++17

std::optional<int&> xx;只是不编译最新的gcc-7.0.0快照.C++ 17标准是否包含std::optional参考文献?为什么不呢?(在专门的专业化中使用指针的实现不会引起任何问题.)

Nic*_*las 12

因为optional,在C++ 17中标准化,不允许引用类型.这被设计排除在外.

有两个原因.首先,从结构上讲,a optional<T&>相当于a T*.它们可能有不同的接口,但它们做同样的事情.

第二件事是,标准委员会实际上没有就确切optional<T&>应该如何表现的问题达成共识.

考虑以下:

optional<T&> ot = ...;
T t = ...;
ot = t;
Run Code Online (Sandbox Code Playgroud)

最后一行应该怎么做?它是否正在引用对象ot并对其进行复制分配,这样做*ot == t?或者它应该重新绑定存储的引用本身,这样ot.get() == &t?更糟糕的是,根据在ot任务之前是否参与,它会做出不同的事情吗?

有些人会期望它做一件事,有些人会期望它做另一件事.所以无论你选择哪一方,都会让人感到困惑.

如果你使用了一个T*,那么很明显会发生什么:

T* pt = ...;
T t = ...;
pt = t;   //Compile error. Be more specific.
*pt = t;  //Assign to pointed-to object.
pt = &t;  //Change pointer.
Run Code Online (Sandbox Code Playgroud)

  • “所以无论你选择哪一边,都会有人感到困惑。” ——那么解决办法就是让双方都感到困惑吧?) (2认同)
  • 为什么不直接禁用 std::Optional 的赋值运算符呢?std::Optional 应该设计为构造并传递给函数或从函数返回。不是为了重新分配它的值,这会导致此类问题。 (2认同)

Bar*_*rry 5

在[可选]中:

需要实例化模板的程序对于引用类型或可能的 cv 限定类型是可选的,in_place_t或者nullopt_t是格式错误的。

没有std::optional<T&>。现在,您必须使用std::optional<std::reference_wrapper<T>>.