Следующий код ведет себя по-разному с пользовательским конструктором копирования или без него в 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);
}
При использовании любого из заданных пользователем конструкторов копирования с комментариями (даже с № 2, выполняющим простую неглубокую копию) утверждение не завершится ошибкой, что означает гарантированная копия работает должным образом.
Однако без какого-либо определяемого пользователем конструктора копирования утверждение не выполняется, что означает, что объект s
в функции main
не создается по умолчанию. Почему это происходит? Не работает ли здесь гарантированное копирование?