【问题标题】:Anyone give me an example to use QVector::QVector(std::initializer_list<T> args)?有人给我一个使用 QVector::QVector(std::initializer_list<T> args) 的例子吗?
【发布时间】:2013-03-16 11:58:50
【问题描述】:

谁能给我一个例子来使用下面的构造函数 int Qt?

QVector::QVector(std::initializer_list<T> args);

【问题讨论】:

    标签: c++ qt c++11 initializer-list


    【解决方案1】:

    当您使用列表初始化时,会考虑采用 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. 传递QVector 参数:

      void foo(QVector<int>);
      
      foo({1, 2, 3, 4, 5});
      
    2. 返回一个QVector

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

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

    一个构造函数是一个 initializer-list 构造函数,如果它的第一个参数是 std::initializer_list&lt;E&gt; 类型或对某些类型 E 的可能有 cv 限定的 std::initializer_list&lt;E&gt; 的引用,并且要么没有其他参数或所有其他参数都有默认参数 (8.3.6)。

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

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

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

    • [...]

    【讨论】:

    • 如果一个函数有一个像Fun(QVector&lt;int&gt;)这样的参数QVector,可以像Fun( QVector&lt;int&gt;{1,2} )那样调用它吗?谢谢。
    • @user1899020 是的,你可以。其实QVector这个构造函数不是explicit,所以你甚至可以做Fun({1, 2, 3})
    • QVector&lt;int&gt; v{1, 2, 3, 4, 5} 甚至不需要()QVector&lt;int&gt; v({1, 2, 3, 4, 5})。如果我添加(),我认为它也应该有效。对吗?
    • @user1899020 我添加了一些更有趣的例子。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-02
    • 1970-01-01
    • 1970-01-01
    • 2020-06-28
    • 1970-01-01
    相关资源
    最近更新 更多