【发布时间】:2019-02-28 15:01:10
【问题描述】:
我对以下代码感到困惑,它(令我惊讶的是)编译:
class A {
int a=0;
};
A returnsA(void)
{
static A myA;
return myA;
}
void works(void)
{
A anotherA;
returnsA() = anotherA;
}
我在标准或网络上找不到任何暗示它不应该编译的东西。对我来说,这似乎很奇怪。
我猜returnsA() 正在返回一个对象(myA 的副本),因此我们对其调用默认的复制赋值运算符,anotherA 被复制分配给返回的对象,然后超出范围并被销毁。
我期待的行为更像这样,但无法编译:
int returnsint(void)
{
static int i=0;
return i;
}
void doesntwork(void)
{
int anotherint=0;
returnsint() = anotherint;
}
谁能进一步告诉我这种行为?
【问题讨论】:
-
相关?也许是愚蠢的stackoverflow.com/q/51172341/817643
-
@StoryTeller 是的,它使用隐式定义的复制赋值运算符。很合法。
-
@P.W,存储说明符是静态的吗?我返回的是 myA 的副本,而不是 myA 本身,对吗?
-
@P.W 它传递静态对象的副本。它是静态的这一事实并不重要。
-
我实际上更惊讶于 int 版本不合法而不是 class 版本。 (我原以为 int 版本完全没用但仍然合法)。
标签: c++