考慮下面的代碼:當未返回未定義對象類型的引用的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