簡體   English   中英

為什么g ++允許我把這個void-function視為什么呢?

[英]Why is g++ allowing me to treat this void-function as anything but?

為什么以下編譯在GCC 4.8( g++ )中? 它不是完全不合格嗎?

void test(int x)
{
    return test(3);
}

int main() {}
  1. 我正在嘗試使用調用test的結果,該結果不存在
  2. 我試圖從test返回一個值

從根本上說,兩者都應該是根本不可能的 - 不僅僅是UB,我還記得 - 具有void返回類型。

我得到的唯一警告是x未被使用,甚至沒有關於添加非標准隱式返回類型的任何內容。

現場演示

這是標准所允許的(§6.6.3/ 3)

表達式為void的return語句只能在返回類型為cv void的函數中使用; 在函數返回其調用者之前計算表達式。

至於為什么GCC允許它 - 確定因為標准要求它有效。 根據標准中規則的基本原理構建傳遞閉包,我很確定GCC允許這樣做,因為它在模板的情況下很有用

template<typename F>
typename std::result_of<F()>::type call(F f) {
  return f();
}

int main() {
   std::cout << call([]{ return 42; }) << std::endl;
   call([]{ std::cout << "I'm just an outputtor!" << std::endl; });
}

如您所見, call不需要在return語句中為void做一個特殊情況。 類似於x.~T()排序,即使T最終為int

暫無
暫無

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

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