【问题标题】:What is the C++ feature being used in this Nana demo code?此 Nana 演示代码中使用的 C++ 功能是什么?
【发布时间】:2015-07-02 09:04:23
【问题描述】:

their webpage上,娜娜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();
}

开始的行中使用的 C++ 功能是什么:drawing{fm}.draw...

我从未见过 {} 被这样使用。

【问题讨论】:

  • 考虑可读性。是的,我可以阅读(并理解)它。但是这样做我也偶然发现了drawing{fm}...这一行。你并不孤单,Scooter。

标签: c++11 nana


【解决方案1】:

这称为统一初始化,是在 C++11 中添加的。参见例如Bjarne's page 了解更多信息。

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

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

有一些细微的区别:即使用{} 将有利于采用initializer_list 的构造函数(如果存在这样的构造函数);使用{} 避免Most Vexing Parse;并且使用{} 避免了参数的隐式有损缩小。详情请见this GotW

【讨论】:

  • 因此正在构造一个临时的或未命名的“绘图”对象,并且构造函数被传递给 fm 变量,然后该新对象正在调用它的 draw() 函数。对吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多