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

7

有人能给我提供一个使用以下构造函数的Qt示例吗?

QVector::QVector(std::initializer_list<T> args);
1个回答

11

当您使用列表初始化时,一个接受 std::initializer_list 的构造函数会被考虑。这是一种涉及到用大括号初始化的方式:

QVector<int> v{1, 2, 3, 4, 5};
// or equivalently
QVector<int> v = {1, 2, 3, 4, 5};

请注意,这是C++11的一个新特性。事实上,第一种语法是从C++11开始新增的,而第二种语法在C++03中就可以用于聚合初始化。
您还可以使用直接初始化并将初始化列表作为参数传递:
QVector<int> v({1, 2, 3, 4, 5});

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

  1. Passing a QVector argument:

    void foo(QVector<int>);
    
    foo({1, 2, 3, 4, 5});
    
  2. Returning a QVector:

    QVector<int> bar()
    {
      return {1, 2, 3, 4, 5};
    }
    

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

如果一个构造函数的第一个参数是类型为 std::initializer_list<E> 或引用到可能带有cv限定符的 std::initializer_list<E> 的某个类型 E,并且要么没有其他参数,要么所有其他参数都具有默认参数(8.3.6),那么这个构造函数就是一个初始化列表构造函数

§13.3.1.7 通过列表初始化进行初始化 [over.match.list]:

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

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

  • [...]


如果一个函数有一个 QVector 类型的参数,比如 Fun(QVector<int>),那么可以这样调用它吗:Fun(QVector<int>{1,2})?谢谢。 - user1899020
2
@user1899020,是的,你可以这样做。事实上,QVector 的这个构造函数并不是 explicit,所以你甚至可以执行 Fun({1, 2, 3}) - Joseph Mansfield
QVector<int> v{1, 2, 3, 4, 5}甚至不需要像“QVector<int> v({1, 2, 3, 4, 5})”那样加上括号。如果我加上了括号,我认为它应该也能正常工作。对吧? - user1899020
1
@user1899020 我添加了一些更有趣的示例。 - Joseph Mansfield

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接