C++ C+中的用户定义扣减指南+;20
我使用的是C++ C+中的用户定义扣减指南+;20,c++,language-lawyer,c++20,type-deduction,C++,Language Lawyer,C++20,Type Deduction,我使用的是std::variant和std::visit,如下所示: #include <iostream> #include <variant> template<class... Ts> struct overloaded : Ts... { using Ts::operator()...; }; template<class... Ts> overloaded(Ts...) -> overloaded<Ts...>; i
std::variant
和std::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);
}
#包括
#包括
模板结构重载:Ts。。。{使用Ts::运算符()…;};
模板重载(Ts…)->重载;
内部主(空){
std::variant-var;
自动fs=过载{
[](int-var){std::cout此更改是由添加的,特别是添加了对聚合的类模板参数推断的支持
具体的措辞可以在其中找到,其中基本上增加了一个针对总量的隐含扣减指南:
此外,如果定义了C
,并且其定义满足聚合类的条件([dcl.init.aggr])假设任何依赖基类都没有虚拟函数和虚拟基类,并且初始值设定项是非空的括号内初始列表或括号内表达式列表,并且C
没有演绎指南,则该集合包含一个额外的函数模板,称为聚合演绎候选函数,定义为f奥罗斯。
设x1,…,xn是带括号的init列表或表达式列表的初始值设定项列表或指定初始值设定项列表的元素。
对于每个席席,让EI成为<代码> C <代码>的相应聚合元素,或者是它的(可能递归的)子集合之一,如果是[p/in],则由XI([dCL,init,AGGR])初始化。
- 对于具有依赖非数组类型或具有值依赖边界的数组类型的任何聚合元素,不考虑大括号省略,并且
- 假设作为包扩展的每个非尾随聚合元素不对应于初始值设定项列表的任何元素,并且
- 假定作为包扩展的尾部聚合元素对应于初始值设定项列表的所有剩余元素(如果有)
如果没有任何XI的这种聚合元素EI,则聚合推断席候选不会被添加到集合中。
如上所述,从假设的构造器C(T1,…,Tn)推导出总扣减候选项,其中
如果EI是数组类型,席是一个支持的init列表或字符串文字,那么TI是声明的EI类型和的RValk引用。
- 否则,Ti是ei的声明类型
除了形式为Pj…的附加参数包插入参数列表中的原始聚合元素位置,该位置对应于Pj类型的每个非尾随聚合元素(因为它是一个参数包而被跳过),以及对应于以下类型的尾随聚合元素的尾随参数序列:组件扩展(如有)由Tn…形式的单个参数代替
基本上,您之前必须编写的扣减指南:
template<class... Ts> overloaded(Ts...) -> overloaded<Ts...>;
模板重载(Ts…)->重载;
现在已经不再使用这种语言了。它确实有效。@cigien谢谢你指出这一点!我并不怀疑这个评论是正确的,只是想弄清楚C++20中的哪些变化使它合法。@nickelpro..支持即将发布的gcc-11。两个链接的提案都没有从包扩展中扣除的措辞。这似乎是正确的已在第4节中提出
template<class... Ts> overloaded(Ts...) -> overloaded<Ts...>;