Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 为什么在使用typedef时类扣减指南失败?_C++_C++17_Parameter Pack_Deduction Guide - Fatal编程技术网

C++ 为什么在使用typedef时类扣减指南失败?

C++ 为什么在使用typedef时类扣减指南失败?,c++,c++17,parameter-pack,deduction-guide,C++,C++17,Parameter Pack,Deduction Guide,在我目前编写的一段代码中,我使用了一个类演绎指南。您可以在下面找到一个简单(但无意义的示例)的代码摘录: 我有一个类User,它从构造函数的第一个参数派生出它的第一个模板参数,第二个参数从作为第二个参数提供的参数包的大小派生出来: #包括 #包括 ///第一个构造函数参数,可用于派生布尔值 模板结构P1{}; ///类,它取决于布尔标志(来自第一个参数)和提供的元素数量。 模板结构用户{ 模板显式constexpr用户(P1和子级), P1…父母)无例外{} }; ///扣除指南 模板用户(P1

在我目前编写的一段代码中,我使用了一个类演绎指南。您可以在下面找到一个简单(但无意义的示例)的代码摘录: 我有一个类
User
,它从构造函数的第一个参数派生出它的第一个模板参数,第二个参数从作为第二个参数提供的参数包的大小派生出来:

#包括
#包括
///第一个构造函数参数,可用于派生布尔值
模板结构P1{};
///类,它取决于布尔标志(来自第一个参数)和提供的元素数量。
模板结构用户{
模板显式constexpr用户(P1和子级),
P1…父母)无例外{}
};
///扣除指南
模板用户(P1&child,P1…)->用户;
int main(){
P1儿童;
用户sa{child,P1{};
用户sa2{child,child,child};
}
这个很好用(编译)。但是,当我通过将参数包的类型替换为依赖于模板参数
切换器的类型来进行微小修改时,推导失败:

#包括
#包括
///第一个构造函数参数,可用于派生布尔值
模板结构P1{};
///在实际示例中,条件#u类型持有不同的类型,具体取决于#bool
模板结构条件类型{using type=T;};
使用条件类型的模板\u t=typename条件类型::type;
模板结构用户{
模板显式constexpr用户(P1和子级),
条件_类型_t…父项)无例外{}
};
模板用户(P1&child,条件类型…->用户;
int main(){
条件型儿童2;
P1儿童;
静态断言(std::is_same_v);
用户sa{child,P1{};//<失败:提供了2个参数,应为1个,无法派生AmountChids
用户sa2{child,child,child};//<失败:
}
为什么呢


这两种代码的变体都可以找到。

第二个示例中的扣减指南相当于我们用别名替换的结果:

template <bool f, int p1, int... pn>
User(P1<p1, f> &child, typename conditional_type<f, P1<pn, f>>::type ...)
    -> User<f, sizeof...(pn) + 1>;
模板
用户(P1和子级,类型名条件类型::类型…)
->用户;
在任何语法
typename A::B
中,如果
A
是从属类型,则类型
A
是从属类型。由于
pn
仅出现在非推断上下文中,因此它永远无法被推断,因此推断指南永远无法使用


出于类似的原因,
User
的构造函数永远不能与多个参数一起使用,即使明确指定了
User
的模板参数。

第二个示例中的演绎指南与我们替换别名得到的相同:

template <bool f, int p1, int... pn>
User(P1<p1, f> &child, typename conditional_type<f, P1<pn, f>>::type ...)
    -> User<f, sizeof...(pn) + 1>;
模板
用户(P1和子级,类型名条件类型::类型…)
->用户;
在任何语法
typename A::B
中,如果
A
是从属类型,则类型
A
是从属类型。由于
pn
仅出现在非推断上下文中,因此它永远无法被推断,因此推断指南永远无法使用


出于类似的原因,
User
的构造函数不能与多个参数一起使用,即使明确指定了
User
的模板参数。

非常感谢您的回答!这是有道理的,我不知道这个概念,链接似乎是阅读它的一个很好的起点:)非常感谢你的回答!这是有道理的,我不知道这个概念,链接似乎是阅读它的一个很好的起点:)