AMC*_*der 5 c++ pass-by-reference temporaries
我编写了以下代码来测试这个:
struct X
{
char* x;
X()
{
x = new char('a');
}
~X()
{
*x = 'b';
delete x;
}
};
void foo(const X& x)
{
}
void goo(X& x)
{
}
int main()
{
foo(X());
goo(X());
}
Run Code Online (Sandbox Code Playgroud)
两个函数退出后调用临时函数的析构函数,但我认为你只能将临时函数绑定到const
引用.为什么goo
工作呢?
是UB和MSVS是错的,还是没问题?
这是非法的。一致的实现会对其进行诊断(即它至少必须发出警告),但 MSVC++ 允许将其作为扩展。
如果你不友善的话,或者是一个错误,但 IIRC 他们仍然允许这样做的原因是长期存在的遗留原因:名义上是为了支持在 C++ 标准化之前为 MSVC++ 编写的代码,但是当然,一旦你允许人们编写这个,他们就会编写它也意外地出现在新代码中,因此遗产继续存在。如果这是故意的,那么它就是一个(错误)功能,而不是一个错误,对吧?无论如何,诊断格式错误的程序需要符合规范的实现,因此如果您没有收到警告,则编译器不符合规范。
归档时间: |
|
查看次数: |
193 次 |
最近记录: |