在C++中,X a()和X a = X()被认为是不同的语句。X a()声明了一个名为a的函数,该函数返回一个类型为X的对象。而X a = X()声明了一个名为a的对象,该对象使用默认构造函数进行初始化,这相当于使用拷贝构造函数从一个临时X()对象中复制一个对象。
但是,现代编译器通常会进行优化,将X a()的行为与X a = X()相同。这是通过将X a()解释为X a{}来实现的,这是一种值初始化(默认构造函数),效果与使用拷贝构造函数从一个临时X()对象中复制相同。
以下是一个例子来说明这个问题:
#include
using namespace std;
class X {
public:
X() { cout << "Default constructor called." << endl; }
X(const X& x) { cout << "Copy constructor called." << endl; }
};
int main() {
X a();
X b = X();
return 0;
}
在上面的示例中,创建了X a()和X b = X()。在大多数情况下,编译器会对上述语句进行优化,因此输出结果将是:
Default constructor called.
Default constructor called.
代码示例:https://repl.it/@QianyuLyu/Compiler-optimisation-C-is-X-a-not-same-as-X-a-X