考虑下面的代码:当未返回未定义对象类型的引用的C++函数的返回值时,会发生什么?
class Foo;
Foo& CreateFoo();
void Bar()
{
CreateFoo();
}
在Visual Studio中,这将导致错误C2027 foo是一个未定义的类型。在大多数其他编译器中,它编译得很好。如果没有分配CreateFoo的返回值,这只是一个问题。如果我将该行更改为:
Foo& foo = CreateFoo();
它在Visual Studio中编译得很好。此外,如果Foo被定义而不是只是前向声明,那么它将在没有赋值的情况下编译好。
哪个应该是正确的行为?在C++标准中有没有解决这个问题的东西,还是这是留给实施的东西?我看了看,没有看到有关这件事的任何内容。
更新: A bug report has been filed.
哪个版本的Visual C++编译器?版本之间的法规遵从性变化很大 – 2012-08-11 01:28:06
这看起来像一个Visual C++编译器错误(我同意Ben Voigt对规范的分析,并且'CreateFoo();'和'Foo&foo = CreateFoo();'之间的行为差异很奇怪)。我没有看到这个问题存在一个缺陷,并且它使用Visual C++ 2012重新生成。如果这个问题对您很重要,请考虑在[Microsoft Connect]上打开一个错误(http://connect.microsoft.com/ VisualStudio /)并在此发布链接以供将来参考。谢谢! – 2012-08-11 01:28:24
VS2010提交了一个错误报告,但它被标记为nofix,因为它是一个记录的限制。他们没有提供关于它是否合规的意见。 VS2010中C2027的MSDN页面显示相同类型的问题。 http://msdn.microsoft.com/en-us/library/6c2dk0ah.aspx请参见上一节。它实际上表示不允许对未定义类型的引用,但事实并非如此,它只是在它未被分配返回值时才出现,这在他们的示例代码中就是这种情况。 – Gerald 2012-08-11 01:34:51