这涉及 C++ 问题http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#1402的解决。概括:
template<typename T> struct wrap { wrap() = default; wrap(wrap&&) = default; wrap(const wrap&) = default; T t; }; struct S { S(){} S(const S&){} S(S&&){} }; typedef wrap<const S> W; // Error, defaulted move constructor of "wrap<const S>" is deleted! W get() { return W(); }
(问题是我们收到了这个片段的错误,即使编译器可以简单地使用“S”的复制构造函数,就像用户显式编写“wrap”的移动构造函数时那样。问题已解决为在重载决议期间忽略已删除的移动构造函数(和赋值运算符),因此根据需要使用上面的复制构造函数。)
在起草该决议时,对该决议发表了以下评论:
与复制相关的隐式/默认移动操作没有其他限制。这意味着虚拟基础中的移动分配是危险的(编译器可能应该警告)[...] 但是我们在 Batavia 中决定我们不会保留所有 C++03 代码以防止隐式移动操作,我认为该解决方案提供了显着的性能优势。
有人可以描述一下虚拟基地移动分配运算符的问题吗?