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

在C++中调用构造函数的正确方法是什么?,c++,constructor,copy,copy-constructor,C++,Constructor,Copy,Copy Constructor,这两个调用之间的区别是什么?区别在于复制省略。在C++17之前,在 Communicator communicator = Communicator(); Communicator communicator; 创建了一个临时通信器对象,然后用于复制construct Communicator。编译器可以对此进行优化,但它必须检查复制或移动构造函数是否可以公共调用,而不是删除,也不是显式调用 自C++17以来,出现了一些变化:引入了非物质化的值传递。现在,在该行中不创建临时对象

这两个调用之间的区别是什么?

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

    Communicator communicator = Communicator();

    Communicator communicator;
创建了一个临时通信器对象,然后用于复制construct Communicator。编译器可以对此进行优化,但它必须检查复制或移动构造函数是否可以公共调用,而不是删除,也不是显式调用

自C++17以来,出现了一些变化:引入了非物质化的值传递。现在,在该行中不创建临时对象,也不需要复制/移动构造函数

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

Communicator communicator = Communicator();

区别在于抄袭省略。在C++17之前,在

    Communicator communicator = Communicator();

    Communicator communicator;
创建了一个临时通信器对象,然后用于复制construct Communicator。编译器可以对此进行优化,但它必须检查复制或移动构造函数是否可以公共调用,而不是删除,也不是显式调用

自C++17以来,出现了一些变化:引入了非物质化的值传递。现在,在该行中不创建临时对象,也不需要复制/移动构造函数

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

Communicator communicator = Communicator();

没有区别,但第二个是简洁的,应该更清楚,你可以写通信器{};从语义上讲,首先使用默认构造函数构造一个临时通信器,然后通过复制该临时通信器来构造通信器,之后该临时通信器将不再存在。实际上,编译器可能会,并且在以后的标准中将省略临时性,因此没有区别。@πάνταῥεῖ 带花括号的函数?@πάνταῥεῖ - Bernd是正确的C++11及更高版本。通信器通信器是一个函数声明,也是最麻烦的解析。统一初始化语法Communicator{}纠正了这一点。在遇到第一个{之前,函数定义中总是有一组零个或多个参数。这没有区别,但第二个是简洁的,应该更清楚,您可以编写通信器{};从语义上讲,首先使用默认构造函数构造一个临时通信器,然后通过复制该临时构造函数来构造通信器,之后该临时构造函数就不存在了。实际上,编译器可能会省略该临时构造函数,并且在以后的标准中会省略该临时构造函数,因此没有区别。@πάνταῥεῖ 带花括号的函数?@πάνταῥεῖ - Bernd是正确的C++11及更高版本。Communicator Communicator是最麻烦的解析函数声明。Communicator Communicator{}统一初始化语法纠正了这一点。函数定义在遇到第一个{之前总是有一组零个或多个参数。