我有以下代码。
class A {
public:
A(int) {
}
};
int a;
int main() {
A(a); // Line 'a
return 0;
}
我想在第 'a' 行创建一个临时的 A
对象,并使用构造函数 A::A(int)
进行初始化。我知道它会被立即销毁,这正是我想要的结果。但是编译器似乎做了一些等同于 A a
的操作,将变量 a
定义为类 A
的实例并使用构造函数 A::A()
进行初始化。当然这个实例并不存在,因此编译器会出现错误。
然而,如果我将我的代码更改为以下内容:
class A {
public:
A(int) {
}
};
void f(A) {
}
int a;
int main() {
f(A(a));
return 0;
}
现在它正常工作。编译器构造一个临时的A
对象并用它来调用f
函数。
为什么A(a)
在两个上下文中不同?这在标准中是如何规定的,还是出于某种不明原因?如何像第一个代码示例中那样构造临时对象?
A{a};
,因为它是最令人困惑的解析的例子?你也可以尝试使用 void 强制转换:static_cast<void>(A(a));
- myauttemp
在这条语句之后立即销毁。如果我给它命名,那是不会发生的。 - Hot.PxLA
,它将起作用,并且如果您将int a;
放在主函数内部,则会出现重新定义a的错误。 - ArnonZA
有一个接受initializer_list
的构造函数,那么@myaut A{a}
将无法工作。第二个方法虽然可行,但使用static_cast
有点丑陋。我想知道为什么会出现这种情况。 - Hot.PxL