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