我编写了以下代码来测试它:
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是错误的还是没问题?
答案 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&)’