有人给我一个使用QVector :: QVector(std :: initializer_list <T> args)的例子吗?

use*_*020 7 c++ qt initializer-list c++11

有人给我一个例子来使用以下构造函数int Qt吗?

QVector::QVector(std::initializer_list<T> args);
Run Code Online (Sandbox Code Playgroud)

Jos*_*eld 11

std::initializer_list使用列表初始化时会考虑使用a的构造函数.这是一个涉及支撑初始化列表的初始化:

QVector<int> v{1, 2, 3, 4, 5};
// or equivalently
QVector<int> v = {1, 2, 3, 4, 5};
Run Code Online (Sandbox Code Playgroud)

请注意,这是一个C++ 11功能.实际上,第一种语法对于C++ 11来说是新的,而第二种语法可能已经在C++ 03中用于聚合初始化.

您还可以使用直接初始化并将初始化列表作为参数传递:

QVector<int> v({1, 2, 3, 4, 5});
Run Code Online (Sandbox Code Playgroud)

由于构造函数不是explicit,它也可以用于其他一些有趣的方式:

  1. 通过QVector论证:

    void foo(QVector<int>);
    
    foo({1, 2, 3, 4, 5});
    
    Run Code Online (Sandbox Code Playgroud)
  2. 退回QVector:

    QVector<int> bar()
    {
      return {1, 2, 3, 4, 5};
    }
    
    Run Code Online (Sandbox Code Playgroud)

§8.5.4列表初始化[dcl.init.list]:

构造函数是初始化列表构造函数,如果它的第一个参数是类型std::initializer_list<E>或引用,可能std::initializer_list<E>是某些类型的cv-qualified E,并且没有其他参数,或者所有其他参数都有默认参数(8.3.6).

§13.3.1.7按列表初始化初始化[over.match.list]:

当非聚合类类型的对象T被列表初始化(8.5.4)时,重载决策分两个阶段选择构造函数:

  • 最初,候选函数是类的初始化列表构造函数(8.5.4),T参数列表由初始化列表作为单个参数组成.

  • [...]

  • @ user1899020是的,你可以.事实上,`QVector`的构造函数不是`explicit`,所以你甚至可以做`Fun({1,2,3})`. (2认同)