【发布时间】:2013-06-19 15:00:40
【问题描述】:
这涉及 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(); }
(问题是我们得到了这个 sn-p 的错误,即使编译器可以简单地使用“S”的复制构造函数,就像用户显式编写“wrap”的移动构造函数时那样。该问题已解决,在重载决议期间忽略已删除的移动构造函数(和赋值运算符),因此可以根据需要使用上面的复制构造函数。)
当分辨率was drafted, the following comment was made关于这个分辨率:
相对于复制的隐式/默认移动操作没有其他限制。这意味着虚拟基础中的移动赋值是危险的(编译器可能应该警告)[...] 但是我们在 Batavia 中决定我们不会保留所有 C++03 代码以防止隐式移动操作,我认为此分辨率提供了显着的性能优势。
有人可以描述一下虚拟基地移动分配运算符的问题吗?
【问题讨论】:
-
它可能不止一次发生?这不只是分配虚拟基地的一般问题的一个方面吗?
-
@KerrekSB 啊我不知道这是可能的。虽然我仍然没有很清楚地看到这个问题。如果您能澄清什么时候会出现问题,我会很高兴。
-
这在 gcc 4.7.3 下编译正常,带有 -std=c++11 -Wall;您使用的是哪个编译器?会不会仅仅是对“用户提供”与“用户定义”的误解导致的编译器缺陷?
-
@kfsone 我认为 DR 负责拒绝的规则是“类型必须具有移动构造函数”。从字面上解释,测试用例确实有效。但实际上,预期的解释出现了“构造函数的重载解析必须选择一个移动构造函数”。因此,虽然“const S”有一个移动构造函数,以“const S”作为参数进行重载解析,但我们得到了复制构造函数作为结果。我不认为 GCC 会按字面意思解释它(鉴于 DR 的决议是由 GCC 的维护者起草的)。也许 GCC 只是已经实施了解决方案。
标签: c++ c++11 c++14 deleted-functions