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