Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/127.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++ 为什么不允许在非类型参数中使用嵌套模板参数进行部分专门化_C++_Partial Specialization_Design Rationale - Fatal编程技术网

C++ 为什么不允许在非类型参数中使用嵌套模板参数进行部分专门化

C++ 为什么不允许在非类型参数中使用嵌套模板参数进行部分专门化,c++,partial-specialization,design-rationale,C++,Partial Specialization,Design Rationale,我有这个密码 template<int N, bool C = true> struct A; template<int N> struct A<N, !(N % 5)> { /* ... */ }; // should work A<25> a; 这很好,因为它不再是非类型参数。但是规范禁止更直接的部分专门化的原因是什么呢?部分专门化要求非类型模板参数在编译时可以解析 此时 template<int N> struct A&

我有这个密码

template<int N, bool C = true>
struct A;

template<int N>
struct A<N, !(N % 5)> {
  /* ... */
};

// should work
A<25> a;

这很好,因为它不再是非类型参数。但是规范禁止更直接的部分专门化的原因是什么呢?

部分专门化要求非类型模板参数在编译时可以解析

此时

template<int N>
struct A<N, !(N % 5)> {
  /* ... */
};
但你也可以

A<25> a1;
A<15> a2;
a1;
A a2;

在这种情况下,编译器如何为N选择一个值?它不能这样做,因此它必须禁止该代码。

我认为很多代码都是历史性的。最初根本不允许使用非类型模板参数。当它们被添加时,有很多限制。当人们尝试不同的可能性,并确认它们不会造成问题时,一些限制被消除了


有些最初的限制没有什么特别的原因,只是因为没有人费心去改变它们。与此非常相似,它们中的许多都可以处理,因此通常移除它们不会造成任何特别的困难。大多数情况下,这归结为一个问题,即是否有人足够关心这一特定案例,并就此写一篇论文。

即使这样,也不允许:。。。我想知道标准的哪一部分不允许它。§14.5.4/9也适用于此?这几乎与,当您可以将函数包装到结构中时,为什么没有部分函数规范?为什么您甚至要将模板与此代码一起使用?我不明白。它知道,因为你在说它是什么。它是25或15。部分专门化的使用告诉编译器对第二个参数使用一个特定的实例化。但是这里A和A是不同的类型,所以可能不止一个实例化。对不起,我不明白你在说什么。是的,
A
A
是不同的类型,这与专门化有什么关系?这对我来说也没有意义。-1:部分专门化告诉编译器在遇到一组匹配的模板参数时使用单个特定定义。然后,该定义将为每组匹配的模板参数生成不同的实例化(与通用模板定义的方式相同)。只有一个完整的专业化才能生成一个实例化。@从C++14和MSVC2017开始,iammilind仍然是禁止的。但我不知道C++17和即将发布的草稿
A<25> a;
A<25> a1;
A<15> a2;