функции по значению, насколько я знаю, при явном вызове конструктора с аргументом того же типа
Но может еще есть какие то ситуации?
Конечно же: Foo lvalue; Foo b = lvalue;
Могу ошибаться, но тут b сконструирован конструктором по умолчанию (без аргументов то бишь) А потом будет работать оператор "="
ошибаетесь, конечно =) оператор = нужен, как выше уже написали, когда уже существующему объекту присваивается новое значение. Вот так: Foo a, b; b = a; этот случай нельзя путать с предыдущим.
У класса может не быть конструктора по умолчанию, или он может быть приватным. Тогда бы по-вашему вообще бы ничего не работало.
есть еще неочевидный случай. #include <iostream> struct A { A() = default; A(const A&) { std::cout << "copy\n"; } A(A&&) { std::cout << "move\n"; } }; int main() { const A a; A b = std::move(a); // copy } когда муваем const A получаем тип const A&&, и он не попадет в A(A&&), потому что мы неконстанте присваиваем const (discards qualifiers). const A& примет и rvalue и lvalue и это const, поэтому выполнится конструктор копирования
Такая "ининициализация" в локальных переменных (даже main то бишь) на самом деле реализуется обычным присваиванием. В Си так точно, по поводу плюсов скорее всего тоже такая запись будет по настоящему инициализацией, когда это делается в глобальной области видимости, вот там тогда это попадет прям в секцию .data и не будет никакого присваивания, только лишь инициализация
Foo lvalue; тоже бы не сработал
это еще и не самый неочевидный случай для мув-семантики. Я бы сказал, ` Movable a; Movable b = std::move(a); ` даже неочевиднее =) Но, кажется, пока рановато рассказывать про семантику перемещения, человеку с обычной бы разобраться
что-то подобное может сработать только с POD, "чисто сишными структурами", не имеющих никаких специальных функций-членов и только из элементарных полей. Для объектов с поведением всегда работают более сложные правила.
Да, ты прав, сейчас протестировал Спасибо
выходит Foo A; Foo B = A; И Foo A; Foo B {A}; Это одно и то же?
При копировании объектов
пожалуй нужно было спросить "когда происходит копирование объекта" для таких остроумных как вы)
когда по каким-то причинам требуется создать копию :)
При инициализации переменной другим объектом класса
кстати, шутки шутками, а иногда это действительно не очевидно. Иногда компилятор может не делать копии в коде, семантика которого предполагает копирование. И наоборот, теоретически, такое тоже возможно (хотя лично я вспомнить примеры не могу)
Обсуждают сегодня