我正在使用 "overload" pattern 处理 std::variantstd::visit,如下所示:

#include <iostream>
#include <variant>

template<class... Ts> struct overloaded : Ts... { using Ts::operator()...; };
template<class... Ts> overloaded(Ts...) -> overloaded<Ts...>;

int main(void) {
  std::variant<int, float> var;
  auto fs = overloaded {
    [](int var) {std::cout << "var is int" << std::endl;},
    [](float var) {std::cout << "var is float" << std::endl;}
  };
  var = 0;
  std::visit(fs, var);
  var = 0.0f;
  std::visit(fs, var);
}
在 cppreference 上,有 an example 说:
// explicit deduction guide (not needed as of C++20)
template<class... Ts> overloaded(Ts...) -> overloaded<Ts...>;
为什么在 C++20 中不再需要这个推导指南?删除类型推导指南会导致 compile to fail on all current compilers ,但现在没有人完全支持 C++20,所以这没有任何意义。任何人都可以指出我讨论这个的规范部分吗?

最佳答案

此更改由 P1021R4 添加,特别是 P1816R0 ,它添加了对聚合的类模板参数推导的支持。
具体的措辞可以在 [over.match.class.deduct]/1 中找到,它基本上为聚合添加了一个隐式推导指南:

基本上,您之前必须编写的演绎指南:

template<class... Ts> overloaded(Ts...) -> overloaded<Ts...>;
现在只是脱离了语言。

关于c++ - C++20 中的用户定义推导指南,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/62868708/

10-11 23:23