提问者:小点点

为什么std::向量CTAD接受int和double?


#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构造函数(已检查),但为什么它同时接受intdouble并且仍然将类型推导为向量

gccclang的结果相同

$ 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)

共1个答案

匿名用户

这里发生了两个重载解析的实例。第一个是推导模板参数。由于init-list中的两种类型不同,因此这里选取size值构造函数(或者更正式地说,由所述构造函数生成的推导指南),将类型推导为double

然后重载解析再次运行以创建对象。使用现在称为double的类型,列表构造函数现在是有效的,因此用于初始化对象。