c++ 11的构造函数中的花括号形参是什么?
What is the curly bracket parameter in the constructor of C++11
我从一些算法书中读到一个Queue的实现,有一个片段对我来说是新的/有趣的,我不理解。我认为这是新的东西,就像c++ 11中vector的初始化列表一样,但由于代码的上下文,我不那么自信。有人能解释一下或者提供一些参考吗?
template <typename T>
class Queue {
private:
size_t head, tail, count;
vector<T> data;
public:
Queue(const size_t &cap=8) : head(0),tail(0),count(0),data({cap}) {}
//... more interfaces
//...
}
有问题的部分是data({cap}),这是什么?它将向量的大小调整为cap?(显然,代码的作者打算在构造数据时给它一个大小上限)
编辑:在阅读了第一个答案和测试后,我们知道书中有错误的片段。它打算给出一个初始上限,但它使用了错误的{}。
这是统一初始化, c++ 11的新特性。然而,在您的示例中,它的使用方式是正确的。应该是:
Queue(const size_t &cap=8) : head(0),tail(0),count(0),data(cap) {}
// ^^^^^
因为目的是调用std::vector<>
的构造函数,该构造函数接受vector的初始大小。以这种方式调用它:
data{cap}
或者这样:
data({cap})
导致构造函数接受std::initializer_list
(初始化列表是c++ 11的另一个新特性,与大括号初始化密切相关),从而产生一个用单个元素初始化的向量,其值为cap
。
您可以在下面的示例中验证上述声明(代码将在下面报告):
#include <vector>
struct X
{
X(int s) : v1({s}), v2{s}, v3(s) { }
std::vector<int> v1;
std::vector<int> v2;
std::vector<int> v3;
};
#include <iostream>
int main()
{
X x(42);
std::cout << x.v1.size() << std::endl; // Prints 1
std::cout << x.v2.size() << std::endl; // Prints 1
std::cout << x.v3.size() << std::endl; // Prints 42
}
相关文章:
- 为不同配置设置MSVC_RUNTIME_LIBRARY的正确方法是什么
- C++避免重复声明的语法是什么
- 在C++中,将大的无符号浮点数四舍五入为整数的最佳方法是什么
- 实现无开销push_back的最佳方法是什么
- 当实参是初始化列表而形参是引用时,重载解析
- c++中的操作符T* (T是模板形参)是什么?
- const迭代器的模板形参,而不是迭代器
- c++形参是一个指向常量对象的指针,但不返回更新后的对象
- 将所有引用形参设为const的理由是什么?
- 模板形参的模糊模板重载是一个容器
- 将vector传递给函数时,默认实参(如果有的话)应该是什么?
- 通过函数实参而不是模板形参获取元组的元素
- c++ 11的构造函数中的花括号形参是什么?
- 在c++中,(void)在形参中做什么?
- 传递给构造函数的形参不是类型
- 类的模板形参,该类也是模板形参
- 模板形参中的类指针——这有什么用?
- 放形音频的正确公式是什么?
- 为什么在形参中使用initializer_list而不是vector ?
- 指针形参和数组形参有什么区别?