这个Nana演示代码中使用的C++功能是什么?

Sco*_*ter 2 c++11 nana

他们的网页上,Nana GUI人员给出了这个例子:

#include<nana/gui.hpp>

int main()
{
     using namespace nana;
     form fm;
     drawing{fm}.draw([](paint::graphics& graph){
         graph.string({10, 10}, L"Hello, world!", colors::red);
     });
     fm.events().click(API::exit);
     fm.show();
     exec();
}
Run Code Online (Sandbox Code Playgroud)

在开始的行中使用的C++特性是什么:drawing {fm} .draw ...

我从来没有见过这样的用法.

Mic*_*ael 6

它被称为统一初始化,并在C++ 11中添加.有关详细信息,请参阅Bjarne的页面.

在您的特定示例中,drawing使用fm作为构造函数的实际参数构造一个未命名的实例drawing.draw然后在此drawing实例上调用该方法.这也可以使用普通的parens编写:

drawing(fm).draw([](paint::graphics& graph){
     graph.string({10, 10}, L"Hello, world!", colors::red);
 });
Run Code Online (Sandbox Code Playgroud)

有一些细微的差别:即使用{}将有利于构造函数initializer_list(如果存在这样的构造函数); 使用{}避免最烦恼的解析 ; 并使用{}避免隐式有损缩小的参数.有关详细信息,请参阅此GotW.

  • 所以正在构造一个临时或未命名的"绘图"对象,并且构造函数被传递给fm变量,然后该新对象正在调用它的draw()函数.那是对的吗? (2认同)