成员类模板的类模板参数推论

时间:2019-02-28 10:02:31

标签: c++ templates c++17

请考虑以下内容

template <typename T1>
struct OuterFoo {
  template <typename T2>
  struct InnerFoo  {
    InnerFoo(T2 v2) {}
  };

  explicit OuterFoo(T1 v1) {}
};

int main() {
  OuterFoo outer_foo{6};
  OuterFoo<int>::InnerFoo inner_foo{3};

  return 0;
}

https://godbolt.org/z/RjUuWM

clang拒绝对此进行编译,指出“没有可行的构造函数或推论指南,不能推论'InnerFoo'的模板参数”-另一方面,Gcc可以毫无问题地进行编译。

所提供的示例是否正确(按照标准)使用CTAD,并且这里出现故障吗?

如果提供了推导指南,则clang可以很好地编译,但是gcc不接受该指南:https://godbolt.org/z/4b-9Cr

template <typename T1>
struct OuterFoo {
  template <typename T2>
  struct InnerFoo  {
    InnerFoo(T2 v2) {}
  };

  // This Template Deduction Guide is required in clang 6
  // for the example to compile.
  // GCC compiles without this TDG but reports an error
  // with it
  // "deduction guide ‘OuterFoo<T1>::InnerFoo(T2) -> OuterFoo<T1>::InnerFoo<T2>’
  // must be declared at namespace scope"
  template<typename T2> InnerFoo(T2 v2) -> InnerFoo<T2>;

  // ...but no TDG is required for OuterFoo
  explicit OuterFoo(T1 v1) {}
};

int main() {
  OuterFoo outer_foo{6};
  OuterFoo<int>::InnerFoo inner_foo{3};

  return 0;
}

clang和gcc中的成员模板类的CTAD状态如何?真的不在那里吗?

1 个答案:

答案 0 :(得分:0)

  

clang和gcc中的成员模板类的CTAD状态如何?真的不在那里吗?

根据language features support page for GCC,CTAD适用于版本7和更高版本。

enter image description here

根据language features support page for Clang,CTAD适用于版本7和更高版本。

![enter image description here

但是,请注意,在这些实现的更高版本中已经报告并解决了缺陷。