簡體   English   中英

C ++使用花括號而不是賦值運算符聲明和實例化范圍變量

[英]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.

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