在 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();
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();