相关疑难解决方法(0)

为什么当T不可移动构造时,std :: optional的move-constructor不会被删除?

根据标准,复制构造函数std::optional<T>:

......除非is_copy_constructible_v<T>是,否则应被定义为删除true.

但是移动构造函数std::optional<T>:

......除非is_move_constructible_v<T>是,否则不得参与超载决议true.

据我了解删除的构造函数,不删除move-constructor的目的std::optional<T>是允许这样的代码:

std::optional<X> o1;
std::optional<X> o2(std::move(o1));
Run Code Online (Sandbox Code Playgroud)

......依靠一些转换序列工作 - o2将由一个A使用a构造的类型的对象构造std::optional<X>&&(如果我错了,请纠正我).

但是对于可能的构造函数std::optional,我很难找到一个可以匹配这个用例的...

为什么移动构造函数std::optional<T>根本不被删除,如果T不是可移动构造的?

c++ optional move-constructor

12
推荐指数
2
解决办法
695
查看次数

在std命名空间中添加模板特化

背景:
我试图回答这个问题为什么我的重载<运算符不能用于STL排序.我的一个建议(除了使用谓词)是在命名空间std中移动自定义operator <,std::string以便编译器可以优先于模板化版本.

以惊人的速度回答了一个高度知名的用户的评论:

这是未定义的行为,不允许向namespace std添加声明,因为它可以更改标准库componens的行为

我的问题:
是否可以为stl类型添加模板特化,即使此特化的声明不包含用户定义的数据类型?


ps我删除了我的答案,因为我担心这可能是错的

c++ stl language-lawyer

5
推荐指数
2
解决办法
635
查看次数

标签 统计

c++ ×2

language-lawyer ×1

move-constructor ×1

optional ×1

stl ×1