c++ 為什麼允許在“for-loop”中宣告變數的“constructor-way”,但是在“if-statement”中不允許?
Possible Duplicate:
07000
考慮這個簡單的例子:
/*1*/ int main() { /*2*/for (int i(7); i;){break;} /*3*/if (int i(7)) {} /*4*/ }
為什麼line-2編譯很好,而第3行給出錯誤?這對我來說很奇怪,為什麼if-statement在這個方面比for-loop更糟糕?
如果這是編譯器具體 – 我用ofollow,noindex" target="_blank">gcc-4.5.1 測試:
prog.cpp: In function ‘int main()’:prog.cpp:3:7: error: expected primary-expression before ‘int’prog.cpp:3:7: error: expected ‘)’ before ‘int’
我受到這個question 的啟發
[UPDATE]
我知道這個編譯很好
/*1*/ int main() { /*2*/for (int i = 7; i;){break;} /*3*/if (int i = 7) {} /*4*/ }
[UPDATE2]
這似乎是純粹的學術問題 – 但是對於類似std :: unique_ptr<>無法複製:
#include <memory> int main() { if (std::unique_ptr<int> i = new (std::nothrow) int(7)) { } if (std::unique_ptr<int> i(new (std::nothrow) int(7))) { } }
這兩種都不允許.不確定新的C11語法{}?
C標準沒有提供理由,但我懷疑使用建構函式符號可能會導致一些不一致.例如,由於在if語句中不允許使用函式宣告,所以最令人煩惱的解析實際上意味著什麼意圖.例如:
int f();// function declaration (simple form or the most vexing parse) if (int f()) {// illegal in C++ but, when allowed, would be a zero-initialized int }
在C 2011中,您可以使用大括號初始化:
if (int x{f()}) { ... }
不幸的是,大括號初始化並不總是意味著與使用建構函式符號相同(我認為它被稱為直接初始化).
關於更新:您可以使用以下其中之一:
if (std::unique_ptr<int> p = std::unique_ptr<int>(new int(1))) { ... } if (auto p = std::unique_ptr<int>(new int(2))) { ... } if (std::unique_ptr<int>{new int(3)}) { ... }
看來有很多選擇:-)
http://stackoverflow.com/questions/12656655/why-constructor-way-of-declaring-variable-in-for-loop-allowed-but-in-if-sta