#include <boost/type_index.hpp>
#include <iostream>
#include <vector>
int main()
{
std::vector v{2, 3.14};
std::cout << boost::typeindex::type_id_with_cvr<decltype(v)>().pretty_name() << '\n';
std::cout << "size: " << v.size() << '\n';
for (auto x : v)
std::cout << "- " << x << '\n';
}
输出为:
std::vector<double, std::allocator<double> >
size: 2
- 2
- 3.14
d::向量实例化使用自动类型演绎(CTAD)。
显然,使用了initializer_list
构造函数(已检查),但为什么它同时接受int
和double
并且仍然将类型推导为向量
gcc
和clang
的结果相同
$ g++ --version
g++ (GCC) 13.0.1 20230401 (Red Hat 13.0.1-0)
$ clang++ --version
clang version 16.0.1 (Fedora 16.0.1-1.fc38)
这里发生了两个重载解析的实例。第一个是推导模板参数。由于init-list中的两种类型不同,因此这里选取size值构造函数(或者更正式地说,由所述构造函数生成的推导指南),将类型推导为double
。
然后重载解析再次运行以创建对象。使用现在称为double
的类型,列表构造函数现在是有效的,因此用于初始化对象。