可变参数类模板参数推导

时间:2019-11-12 18:10:15

标签: c++ c++17 variadic-templates template-argument-deduction

问题描述

考虑以下 variadic 类:

template <typename... Args>
struct Foo {
  template <typename... OArgs>
  Foo(const OArgs&... args) {
    static_assert(std::is_same_v<Foo<Args...>, Foo<OArgs...>>);
  }
};

当我需要实例化此类时,我需要指定类模板参数。

int main() {
  Foo<int, double> foo1{42, 3.14};
  return 0;
}

到目前为止有效;但是,嘿,这是 C ++ 17 ,我可以使用CTAD并让编译器推断类型。

这是规则:

template <typename... Ts>
explicit Foo(const Ts&...)->Foo<Ts...>;

现在我的实例化应该更容易了:

int main() {
  Foo foo2{42, 3.14};
  return 0;
}

但是,我在 gcc 上得到了预期的结果。

实际上, gcc 总是推断出Args = {}(一个空包)。

<source>: In instantiation of 'Foo<Args>::Foo(const OArgs& ...) [with OArgs = {int, double}; Args = {}]':
<source>:16:20:   required from here
<source>:7:24: error: static assertion failed

注意 clang 对此进行编译。


参考文献

问题

  • 哪个编译器在这里正确?
  • 为什么不正确的编译器会以这种方式运行?

0 个答案:

没有答案