根据标准,复制构造函数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
不是可移动构造的?
背景:
我试图回答这个问题为什么我的重载<运算符不能用于STL排序.我的一个建议(除了使用谓词)是在命名空间std中移动自定义operator <
,std::string
以便编译器可以优先于模板化版本.
以惊人的速度回答了一个高度知名的用户的评论:
这是未定义的行为,不允许向namespace std添加声明,因为它可以更改标准库componens的行为
我的问题:
是否可以为stl类型添加模板特化,即使此特化的声明不包含用户定义的数据类型?
ps我删除了我的答案,因为我担心这可能是错的