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

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

提问人:idan shmuel 提问时间:12/15/2020 更新时间:12/15/2020 访问量:72

问:

    Communicator communicator = Communicator();

    Communicator communicator;

这两个电话有什么区别?

C++ 复制 复制构造函数

评论

1赞 Moia 12/15/2020
没有区别,但第二个是简洁的,应该是首选
2赞 Bernd 12/15/2020
为了更清楚,你可以写Communicator communicator{};
5赞 Peter 12/15/2020
从语义上讲,第一个使用默认构造函数构造一个临时构造函数,然后通过复制该临时构造函数进行构造,之后临时构造函数将不复存在。实际上,编译器可能会(在后来的标准中)省略临时的,所以没有区别。Communicatorcommunicator
1赞 Scheff's Cat 12/15/2020
@πάνταῥεῖ 带有大括号的功能?
1赞 Peter 12/15/2020
@πάνταῥεῖ - Bernd 是正确的(C++11 及更高版本)。 是一个函数声明(最令人烦恼的解析)。统一初始化语法纠正了这一点。在遇到第一个参数之前,函数定义总是有一组零个或多个参数。Communicator communicator()Communicator communicator{}(){

答:

3赞 Evg 12/15/2020 #1

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

Communicator communicator = Communicator();

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

从 C++17 开始,复制省略规则发生了变化:“非具体化值传递”被引入。现在,在该行中,不会创建任何临时对象,也不需要复制/移动构造函数。

以下简单代码将在 C++17 中编译,但在 C++11/14 中无法编译

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

Communicator c = Communicator();