簡體   English   中英

如果未分配返回未定義對象類型引用的C ++函數的返回值,會發生什么?

[英]What should happen when the return value from a C++ function that returns a reference of an undefined object type is not assigned?

請考慮以下代碼:

class Foo;

Foo& CreateFoo();


void Bar()
{
   CreateFoo();
}

在Visual Studio中,這將導致錯誤C2027,即Foo是未定義的類型。 在大多數其他編譯器中,它編譯得很好。 如果未分配CreateFoo的返回值,則只是一個問題。 如果我將行更改為:

Foo& foo = CreateFoo();

它在Visual Studio中編譯得很好。 此外,如果定義Foo而不是僅僅向前聲明,那么它將編譯正常而沒有賦值。

哪個應該是正確的行為? C ++標准中有什么可以解決這個問題,還是留給實現的呢? 我看了,沒有看到任何談論這件事。

更新: 已提交錯誤報告。

這看起來像標准的相關部分(第5.2.2節):

如果結果類型是左值引用類型或對函數類型的右值引用,則函數調用是左值;如果結果類型是對象類型的右值引用,則為xvalue,否則為prvalue。

如果函數調用是對象類型的prvalue:

  • 如果函數調用是

    • decltype-specifier的操作數或

    • 逗號運算符的右操作數,它是decltype-specifier的操作數,

    不為prvalue引入臨時對象。 prvalue的類型可能不完整。 [注意:因此,不為prvalue分配存儲空間,也不會銷毀存儲空間; 因此,由於在此上下文中是函數調用的類型,因此不會實例化類類型。 無論表達式是使用函數調用符號還是運算符表示法(13.3.1.2),都是如此。 - 尾注] [注意:與decltype-specifier的規則不同,它考慮id-expression是否帶括號(7.1.6.2),括號在此上下文中沒有特殊含義。 - 結束說明]

  • 否則,prvalue的類型應完整。

由於此函數結果類型是左值引用類型,因此函數調用求值為左值,並且完整性要求不適用。

代碼是合法的,至少在C ++ 11中,沒有發布的Visual C ++版本完全實現。

您總是可以在函數聲明中使用不完整的類型(因為它只聲明函數的簽名,而不是任何實際代碼),但在使用它時則不然。

調用CreateFoo(); 等於(void) CreateFoo(); ,我的猜測是Visual Studio需要檢查Foo的代碼來進行任何轉換(我不確定你是否真的可以編寫一個void轉換),因為對於轉換你需要一個完整的類型。

至於Foo & foo = CreateFoo(); ,這不會進行任何轉換,因此您可以使用不完整的類型。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM