[英]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() {}
test
的結果,該結果不存在 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.