c++ - 初始化列表的模板替换错误
问题描述
我知道如何使以下代码工作:我只是取消注释打印机的第二个构造函数。
这个想法很简单:我想编写一个构造函数/函数,它可以接受存储在一些我可以迭代的抽象数据结构中的几个参数。我希望它至少可以与向量和列表一起使用(它可以),但也可以与初始化列表一起使用(但它不能)。
我使用以下简单语法(可能比我想要的更通用,我不使用模板模板)所以我不必编写可变参数模板来处理 std:: 的分配器类型
#include <iostream>
#include <vector>
#include <list>
#include <initializer_list>
using namespace std;
struct Printer
{
template<class Container>
Printer(const Container& cont)
{
for(const auto & e : cont)
cout << e << " ";
cout << endl;
}
//template<class T>
//Printer(const initializer_list<T> & l)//why should I ?
//{
// for(const T & e : l)
// cout << e << " ";
// cout << endl;
//}
};
int main()
{
vector<int> v = {1,2,3};
Printer pv(v);
Printer pv2 = v; //ok : not explicit
list<char> l = {'a', 'b', 'c'};
Printer pl(l);
Printer pl2 = l; //ok : not explicit
Printer pi1 = {4,5,6};
Printer pi2 ({4,5,6}); //same as above if explicit
}
但是为什么我要明确地为初始化列表编写一个特定的构造函数呢?错误是“无法将 '{4, 5, 6}' 从 '' 转换为 'Printer'”。
基本上,它告诉的是替换不适用于初始化列表。但为什么 ?
解决方案
大括号括起来的初始化列表(正式名称为braced-init-list)不是std::initializer_list
. 它可以转换为一个,但它不是一个。它也不是容器类型。它根本不是一种类型,实际上,它是一个由以下符号序列组成的语法结构:
{初始化列表,选择}
{ }
因此,这种语法不会完全起作用:
Printer pi1 = {4,5,6};
Printer pi2 ({4,5,6}); //same as above if explicit
如果Printer
是一个聚合,那么它可以执行聚合初始化。
否则,您有点难以接受std::initializer_list
可以从您提供的大括号括起来的初始化器列表中构造的一个。
更多信息:
您实际使用该语法所做的事情称为list-initialization,(聚合初始化是一种列表初始化)。只是为了进一步混淆事情,当用于初始化一个类型时,T{a, b, c, ...}
它被称为初始化列表。请勿将其与std::initializer_list
.
在std::initializer_list
C++11 中添加时,它得到了特殊处理。现在可以使用花括号初始化列表在构造函数中构造临时对象std::initializer_list
。这就是你看到我们突然能够std::vector<int>
如此轻松地创建一个std::vector<int> vec{1, 2, 3, 4, 5, ...};
但是,要警惕的一件事是,std::initializer_list
构造函数是“高优先级”构造函数,编译器会在您最不怀疑的时候 选择它。
推荐阅读
- flutter - 未找到 Flutter Firebase 功能
- r - 在 R 函数中使用 compiler::cmpfun 计算迭代逻辑没有得到加速(func(i) 依赖于 func(i - 1))
- android - 将 Postman 请求发送到 json 服务器时出现问题
- django - 在 Django 中批量创建捕获异常
- graphql - 拦截缓存的graphql响应
- html - SVG圆在旋转时弹跳
- visual-studio-code - 默认情况下,Video Studio Code 中终端中显示的输入/输出是否保存在任何地方?
- javascript - 未捕获的类型错误:无法读取 null 的属性“添加”-slick.js
- python - 使用一个热编码列参数创建箱线图
- html - 要输入的数据列表...在 vue 中没有数据列表