在 C++ 中调用构造函数的正确方法是什么?

what is the right way to call to constructor in c++?

    Communicator communicator = Communicator();

    Communicator communicator;

这两个调用有什么区别?

区别在于复制省略。在 C++17 之前,行

Communicator communicator = Communicator();

创建了一个临时 Communicator 对象,然后用于复制构造 communicator。编译器可以对此进行优化,但它必须检查是否可以调用复制或移动构造函数(public,不是删除,不是 explicit)。

自 C++17 起,copy elision rules 发生了变化:引入了“非物化值传递”。现在在该行中没有创建临时对象,也不需要 copy/move 构造函数。

以下简单代码将在 C++17 中编译,但 will fail to compile 在 C++11/14 中编译:

class Communicator {
public:
    Communicator() = default;
    Communicator(const Communicator&) = delete;
};

Communicator c = Communicator();