临时数可以绑定到非const引用吗?

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是错的,还是没问题?

Ste*_*sop 3

这是非法的。一致的实现会对其进行诊断(即它至少必须发出警告),但 MSVC++ 允许将其作为扩展。

如果你不友善的话,或者是一个错误,但 IIRC 他们仍然允许这样做的原因是长期存在的遗留原因:名义上是为了支持在 C++ 标准化之前为 MSVC++ 编写的代码,但是当然,一旦你允许人们编写这个,他们就会编写它也意外地出现在新代码中,因此遗产继续存在。如果这是故意的,那么它就是一个(错误)功能,而不是一个错误,对吧?无论如何,诊断格式错误的程序需要符合规范的实现,因此如果您没有收到警告,则编译器不符合规范。