我正在观看 Bjarne Stroustrup 关于 C++11 风格的主题演讲 (link http://channel9.msdn.com/Events/GoingNative/GoingNative-2012/Keynote-Bjarne-Stroustrup-Cpp11-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
是为了编译这段代码吗?
任何可以从 a 初始化的类型int
。例如,如果您的Gadget
类有一个构造函数int
,或者采取可以直接从初始化的东西int
,这使得代码可以编译。
这条线上有什么概念在起作用:Gadget g {n};
?即声明后的花括号是什么?
这是统一的初始化语法。它消除了括号表示法的一些令人讨厌的问题,这些问题会使 C++ 编译器将以下内容解析为函数声明(而不是对象的初始化):
struct Widget { /* ... */ };
struct Gadget { Gadget(Widget const&) { /* ... */ } /* ... */ };
Gadget g(Widget()); // This is parsed a FUNCTION DECLARATION
在上面的例子中,程序员的意图可能是构造一个对象g
类型的Gadget
并从临时初始化它Widget
object:但是,编译器会将其解析为调用函数的声明g
返回一个Gadget
并接受一个(指向 a 的指针)函数作为其参数,该函数不接受任何参数并返回Widget
。这被称为最令人烦恼的解析 http://en.wikipedia.org/wiki/Most_vexing_parse问题。
注意,当使用大括号时,上述问题不存在:
Gadget g{Widget{}}; // This could not be possibly parsed as a function declaration!
(可能太宽泛了,但是)为什么编译器不会将花括号识别为有效语法?
这很可能是因为您没有使用符合 C++11 的编译器。您应该使用一个,并使用-std=c++11
or -std=c++0x
编译标志以启用 C++11 支持。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)