Communicator communicator = Communicator();
Communicator communicator;
В чем разница между этими двумя вызовами?
Возможно, одно отличие заключается в том, что писать дольше. Возможно, в небольших примерах это будет не так уж важно, но когда вы начнете писать много кода и вызывать много конструкторов, это будет иметь значение. Кроме того, лично я нахожу второй более читаемым, так как первый немного больше похож на геттер.
Чтобы было понятнее, вы могли бы написать Communicator communicator{};
Семантически первый строит временный Communicator
, используя конструктор по умолчанию, а затем конструирует communicator
, копируя этот временный объект, после чего временный объект перестает существовать. На практике компиляторы могут (и в более поздних стандартах будут) опускать временные значения, так что разницы нет.
@πάνταῥεῖ Функция с фигурными скобками?
@ πάνταῥεῖ - Бернд прав (C++ 11 и новее). Communicator communicator()
— это объявление функции (самый неприятный разбор). Единый синтаксис инициализации Communicator communicator{}
исправляет это. И определение функции всегда имеет набор из нуля или более аргументов в ()
до того, как встретится первый {
.
@Peter Может быть, акцент был сделан на похожем ... ;-)
@Scheff - πάνταῥεῖ отредактировал комментарий. Мой комментарий был ответом на комментарий перед редактированием. И, "похоже" или нет - это не так.
@Scheff Бывает, когда я пропускаю очки, извините.
@Moia Есть разница. Попробуйте сделать и то, и другое с помощью std::atomic
в C++ 11/14.
@πάνταῥεῖ «Очки» тоже пришли мне на ум. ;-)
Разница заключается в исключении копии. До C++17 в строке
Communicator communicator = Communicator();
был создан временный объект Communicator
, который затем использовался для копирования-конструкции communicator
. Компилятор мог бы оптимизировать это, но он должен был проверить, что этот конструктор копирования или перемещения может быть вызван (общедоступный, не удаленный, не explicit
).
Начиная с C++17, правила исключения копирования претерпели изменения: была введена "передача нематериализованного значения". Теперь в этой строке не создается временный объект и не требуется конструктор копирования/перемещения.
Следующий простой код скомпилируется в C++17, но не скомпилируется в C++11/14:
class Communicator {
public:
Communicator() = default;
Communicator(const Communicator&) = delete;
};
Communicator c = Communicator();
нет никакой разницы, но второй краток и должен быть предпочтительнее