c – gcc和clang都在下面的代码片段中忽略了对move构造函数的调
在下面的代码中,类S的对象s用于使用直接初始化D d(s);来初始化类D的对象.转换函数S :: operator D()用于将对象转换为D类型的临时对象.然后,gcc和clang都忽略对移动构造函数D(&&)的显式调用,以移动它临时对象进入d.见
live example.
#include <iostream> struct D; struct S{ operator D(); }; struct D{ D(){} D(D&&) { std::cout << "move constructor" << 'n'; } }; S::operator D() { std::cout << "conversion function" << 'n'; return D(); } int main() { S s; D d(s); } 我基于以下理由对这个省略的正确性提出异议: >这个案例在§8.5/ 16(N3337)的第一个子项目中有所涉及,它没有提及elision.
>请注意,下一个子项目明确提到了省略的可能性. 解决方法
C标准喜欢在完全不同的地方创建在一个地方定义的规则的例外.
复制/移动省略规则在12.8 / 31中规定.您的代码中有两个要删除的复制/移动操作. 第一个很简单:在运算符D中,返回表达式中构造的临时值被移动到表示函数返回值的临时值.子弹3允许省略此举. 第二个是将临时函数返回值移动到d对象.同样,子弹3允许省略.
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |