繁体   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