相关疑难解决方法(0)

保证复制省略的行为是否依赖于用户定义的复制构造函数的存在?

以下代码在GCC 8.0.1下使用或不使用用户定义的复制构造函数的行为有所不同:

#include <cassert>

struct S {
    int i;
    int *p;
    S() : i(0), p(&i) {}
    // S(const S &s) : i(s.i), p(&i) {}  // #1
    // S(const S &s) : i(s.i), p(s.p) {} // #2
    // S(const S &s) = delete;           // #3
};

S make_S() {return S{};}

int main()
{
    S s = make_S();
    assert(s.p == &s.i);
}
Run Code Online (Sandbox Code Playgroud)

使用注释的用户定义的复制构造函数(即使是#2,执行简单的浅复制的那个),断言也不会失败,这意味着保证的复制省略按预期工作.

然而,在没有任何用户定义的复制构造,则断言失败,这意味着该对象smain功能不被缺省构造.为什么会这样?保证复制省略不在这里执行吗?

c++ language-lawyer copy-elision c++17 gcc8

16
推荐指数
1
解决办法
631
查看次数

标签 统计

c++ ×1

c++17 ×1

copy-elision ×1

gcc8 ×1

language-lawyer ×1