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