以下代码在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,执行简单的浅复制的那个),断言也不会失败,这意味着保证的复制省略按预期工作.
然而,在没有任何用户定义的复制构造,则断言失败,这意味着该对象s在main功能不被缺省构造.为什么会这样?保证复制省略不在这里执行吗?