【发布时间】:2013-03-16 11:58:50
【问题描述】:
谁能给我一个例子来使用下面的构造函数 int Qt?
QVector::QVector(std::initializer_list<T> args);
【问题讨论】:
标签: c++ qt c++11 initializer-list
谁能给我一个例子来使用下面的构造函数 int Qt?
QVector::QVector(std::initializer_list<T> args);
【问题讨论】:
标签: c++ qt c++11 initializer-list
当您使用列表初始化时,会考虑采用 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,所以还可以用其他一些有趣的方式使用:
传递QVector 参数:
void foo(QVector<int>);
foo({1, 2, 3, 4, 5});
返回一个QVector:
QVector<int> bar()
{
return {1, 2, 3, 4, 5};
}
§8.5.4 列表初始化 [dcl.init.list]:
一个构造函数是一个 initializer-list 构造函数,如果它的第一个参数是
std::initializer_list<E>类型或对某些类型E的可能有 cv 限定的std::initializer_list<E>的引用,并且要么没有其他参数或所有其他参数都有默认参数 (8.3.6)。
§13.3.1.7 通过列表初始化 [over.match.list] 进行初始化:
当非聚合类类型
T的对象被列表初始化(8.5.4)时,重载决策分两个阶段选择构造函数:
最初,候选函数是
T类的初始化列表构造函数 (8.5.4),参数列表由初始化列表作为单个参数组成。[...]
【讨论】:
Fun(QVector<int>)这样的参数QVector,可以像Fun( QVector<int>{1,2} )那样调用它吗?谢谢。
QVector这个构造函数不是explicit,所以你甚至可以做Fun({1, 2, 3})。
QVector<int> v{1, 2, 3, 4, 5} 甚至不需要() 像QVector<int> v({1, 2, 3, 4, 5})。如果我添加(),我认为它也应该有效。对吗?