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

时间:2012-05-16 08:55:05

标签: 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());
}

在两个函数退出后,临时对象的析构函数被称为,但我认为你只能将临时绑定到const引用。为什么goo会起作用?

UB和MSVS是错误的还是没问题?

2 个答案:

答案 0 :(得分:3)

这是非法的。符合标准的实现会诊断它(即它必须至少警告),但MSVC ++允许它作为扩展。

如果你不友好,或者是一个bug,但IIRC他们仍然允许它的原因是长期遗留的原因:名义上支持在C ++标准化之前为MSVC ++编写的代码,但当然一旦你允许人们写这个,他们也在新代码中意外地写了它,所以遗产继续存在。如果它是故意的那么它是一个(错误的)功能,而不是一个错误,对吧?无论如何,一致的实现是 required 来诊断不正确的程序,所以如果你没有得到警告,那么编译器就不符合。

答案 1 :(得分:1)

这显然是MS扩展。例如,在GCC 4.3.4中,它fails to compile,并带有以下消息:

prog.cpp: In function ‘int main()’:
prog.cpp:25: error: invalid initialization of non-const reference of type ‘X&’ from a temporary of type ‘X’
prog.cpp:18: error: in passing argument 1 of ‘void goo(X&)’