【发布时间】:2015-05-13 08:50:42
【问题描述】:
我有以下代码。
class A {
public:
A(int) {
}
};
int a;
int main() {
A(a); // Line 'a
return 0;
}
我想在'a 行做的是用构造函数A::A(int) 创建一个临时A。我知道它会立即毁灭。这就是我想要的。但似乎编译器正在执行与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 temp(a);。 -
您是否尝试过在第一个示例中使用
A{a};,因为它是最麻烦的解析示例?您也可以尝试使用 void-cast:static_cast<void>(A(a)); -
@jakber 我希望
temp在此声明后立即销毁。如果我给它一个名字,它就不会发生。 -
jakber:不,那么它将一直存在到范围结束。 Hot Pxl 希望它在语句结束时破坏。
-
请注意,如果您使用数字初始化
A,它会起作用,并且如果您将int a;放在main中,则重新定义a会出错。
标签: c++