[英]C++ Declaration and instantiation of scoped variable with curly braces instead of assignment operator
我正在觀看Bjarne Stroustrup在C ++ 11 Style( 鏈接 )上的主題演講( 鏈接 )(00:35:30),我很難理解以下內容(從幻燈片中復制的代碼):
void f(int n, int x)
{
Gadget g {n};
// ...
if (x<100) throw std::run_time_error{"Weird!"};
if (x<200) return;
// ...
}
我嘗試使用結構和對象編譯此代碼,但在這兩種情況下,編譯器都告訴我它期待';' 在Gadget g
的聲明結束時,不會編譯。
因此,我的問題是:
g
正在被實例化? Gadget
必須是什么類型的對象? Gadget g {n};
? 即聲明后的花括號是什么? 我是否正確地假設g正在被實例化?
是的,你是對的。
這個代碼要編譯的
Gadget
必須是什么類型的對象?
可以從int
初始化的任何類型。 例如,如果你的Gadget
類有一個構造函數接受一個int
,或者采取一些可以直接從int
初始化的東西,那么代碼就會被編譯。
在這一行上有什么概念:
Gadget g {n};
? 即聲明后的花括號是什么?
這是統一的初始化語法。 它消除了一些令人討厭的問題,括號表示法會使C ++編譯器將以下內容解析為函數聲明(而不是對象的初始化):
struct Widget { /* ... */ };
struct Gadget { Gadget(Widget const&) { /* ... */ } /* ... */ };
Gadget g(Widget()); // This is parsed a FUNCTION DECLARATION
在上面的例子中,程序員的意圖可能是構造一個Gadget
類型的對象g
並從一個臨時Widget
對象初始化它:但是,編譯器會將其解析為一個名為g
的函數的聲明,它返回一個Gadget
和將一個(指向一個)函數作為參數,不接受任何參數並返回一個Widget
。 這被稱為最令人煩惱的解析問題。
請注意,使用大括號時,上述問題不存在:
Gadget g{Widget{}}; // This could not be possibly parsed as a function declaration!
(可能過於寬泛,但是)為什么編譯器不能將花括號識別為有效語法?
這很可能是因為您沒有使用符合C ++ 11的編譯器。 您應該使用一個,並使用-std=c++11
或-std=c++0x
編譯標志來啟用C ++ 11支持。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.