【发布时间】:2025-12-21 13:10:06
【问题描述】:
我试图重现视频C++ Weekly - Ep 48 - C++17's Variadic using 的结果,但失败了。问题可以简化为如下代码段。
假设我有这样的通用结构:
template <class... T>
struct Container {
template <class... U>
Container(U... us) {}
};
现在我可以使用任何参数初始化Container,例如
auto d = Container(1,2,3);
但是,编译器永远不会知道d 是什么类型。为了解决这个问题,我们应该提供一个扣除指南,例如
template <class... U>
Container(U...) -> Container<double, int, bool>
根据视频,编译器现在应该知道d 的类型为Container<double, int, bool>。
但是,代码没有按预期工作。打印typeid(d).name()时,输出永远是9ContainerIJEE,翻译成Container<>,不管我在推导指南里怎么改返回类型,说明这样的指南根本不指导编译器。
我用的是gcc-7-snapshot-20170402,视频中的编译器是gcc-7-snapshot-20170130。
谁能告诉我这里出了什么问题?
更新:
顺便说一句,如果我明确写
Container<bool, int> d = Container(1,2,3);
Container<char, char, char> d = Container(1,2,3);
...
代码将始终编译,并提供像 9containerIJbiEE
和 9containerIJcccEE 这样的输出。
【问题讨论】:
-
对我来说看起来像一个 gcc 错误。
9ContainerIJEE不包含任何信息,但尝试为每个单独的模板参数打印 typeid().name()。