相关疑难解决方法(0)

使用未扩展的参数包作为模板模板参数的非类型模板参数的类型是否合法?

gcc 和 clang 对于以下代码是否应该编译存在分歧:

template <typename... Args>
struct tuple {};

template <typename>
struct Test;

template <
    typename... Types,
    template <Types> typename... Outer, // XXX
    Types... Inner
>
struct Test<tuple<Outer<Inner>...>> {};

template <long T> struct O1 {};
template <unsigned T> struct O2 {};

Test<tuple<O1<1>, O2<2>>> test;
Run Code Online (Sandbox Code Playgroud)

clang 接受代码,推导Types = {long, unsigned}, Outer = {O1, O2}, Inner={1L, 2U}. 从结构上看,这似乎是正确的。

gcc 因推导失败而拒绝该代码。有趣的是,它确实接受 ifO2更改为采用long非类型模板参数,这对我来说似乎不一致。它表明类型可以扩展 ifTypes = {long, long}但不能扩展 if Types = {long, unsigned}。 …

c++ language-lawyer variadic-templates template-argument-deduction c++17

5
推荐指数
1
解决办法
268
查看次数