C++ C++;用大括号代替赋值运算符声明和实例化作用域变量

C++ C++;用大括号代替赋值运算符声明和实例化作用域变量,c++,c++11,scope,C++,C++11,Scope,我正在观看Bjarne Stroustrup关于C++11 Style()(00:35:30)的主题演讲,在理解以下内容时遇到了困难(从幻灯片中复制的代码): void f(整数n,整数x) { Gadget g{n}; // ... if(x) 我假设g正在实例化,对吗 是的,你说得对 要编译此代码,Gadget必须是什么类型的对象 可以从int初始化的任何类型。例如,如果您的Gadget类的构造函数采用int,或者采用可以直接从int初始化的内容,则会编译代码 这一行使用了什么概念:Gadg

我正在观看Bjarne Stroustrup关于C++11 Style()(00:35:30)的主题演讲,在理解以下内容时遇到了困难(从幻灯片中复制的代码):

void f(整数n,整数x)
{
Gadget g{n};
// ...
if(x)
我假设g正在实例化,对吗

是的,你说得对

要编译此代码,
Gadget
必须是什么类型的对象

可以从
int
初始化的任何类型。例如,如果您的
Gadget
类的构造函数采用
int
,或者采用可以直接从
int
初始化的内容,则会编译代码

这一行使用了什么概念:
Gadget g{n};
?即声明后的花括号是什么

这是统一的初始化语法。它消除了一些圆括号符号的一些严重问题,这将使C++编译器将下列函数解析为函数声明(而不是作为对象的初始化):

在上面的示例中,程序员的意图可能是构造一个类型为
Gadget
的对象
g
,并从一个临时
Widget
对象对其进行初始化:然而,编译器会将其解析为一个名为
g
的函数的声明,该函数返回一个
Gadget
,并将其作为参数nt是一个(指向a的指针)函数,它不接受任何参数,并返回一个
小部件
。这就是所谓的问题

请注意,使用大括号时,上述问题不存在:

Gadget g{Widget{}}; // This could not be possibly parsed as a function declaration!
(可能太宽了,但是)为什么编译器不能识别大括号作为有效语法


这很可能是因为您没有使用与C++11兼容的编译器。您应该使用一个,并使用
-std=C++11
-std=C++0x
编译标志来启用C++11支持。

这是C++11语法。您需要相关的编译器支持。只需使用与C++11兼容的编译器,并使用
-std=C++11
即可de>-std=c++0x
标志
使用Gadget=int;
可能是可以从int初始化的简单类型;)
struct Widget { /* ... */ };
struct Gadget { Gadget(Widget const&) { /* ... */ } /* ... */ };

Gadget g(Widget()); // This is parsed a FUNCTION DECLARATION
Gadget g{Widget{}}; // This could not be possibly parsed as a function declaration!