Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/9.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++ 关于显式专门化规则的一个问题,其中提到隐式实例化 #包括 模板结构A{ 枚举E:T; }; 模板枚举A::E:T{eT}; 模板枚举A::E:char{/#1 埃卡尔 }; int main(){ }_C++_Templates_Language Lawyer - Fatal编程技术网

C++ 关于显式专门化规则的一个问题,其中提到隐式实例化 #包括 模板结构A{ 枚举E:T; }; 模板枚举A::E:T{eT}; 模板枚举A::E:char{/#1 埃卡尔 }; int main(){ }

C++ 关于显式专门化规则的一个问题,其中提到隐式实例化 #包括 模板结构A{ 枚举E:T; }; 模板枚举A::E:T{eT}; 模板枚举A::E:char{/#1 埃卡尔 }; int main(){ },c++,templates,language-lawyer,C++,Templates,Language Lawyer,考虑上面提到的,这是一个典型的格式错误的代码。规则规定: 如果一个模板、一个成员模板或一个类模板的一个成员被明确地专门化,那么该专门化应在第一次使用该专门化之前声明,该专门化将导致在发生此类使用的每个翻译单元中发生隐式实例化;无需诊断 在点#1处,专门化A将导致隐式实例化 作为对比: #包括 模板结构A{ 结构测试; }; 模板 结构A::测试{ }; 模板 结构A::测试{/#2 INTC; }; int main(){ } 考虑到这一点,在点#2处,专门化A也会导致隐式实例化,这两个代码之

考虑上面提到的,这是一个典型的格式错误的代码。规则规定:

如果一个模板、一个成员模板或一个类模板的一个成员被明确地专门化,那么该专门化应在第一次使用该专门化之前声明,该专门化将导致在发生此类使用的每个翻译单元中发生隐式实例化;无需诊断

在点
#1
处,专门化
A
将导致隐式实例化

作为对比:

#包括
模板结构A{
结构测试;
};
模板
结构A::测试{
};
模板
结构A::测试{/#2
INTC;
};
int main(){
}
考虑到这一点,在点
#2
处,专门化
A
也会导致隐式实例化,这两个代码之间隐式实例化的差异如下所示:

类模板专门化的隐式实例化会导致声明的隐式实例化,但不会导致类成员函数、成员类、作用域成员枚举、静态数据成员、成员模板和好友的定义、默认参数或noexcept说明符的隐式实例化并导致非作用域成员枚举和成员匿名联合的定义的隐式实例化。但是,为了根据[basic.def.odr]和[class.mem]确定实例化的重新声明是否有效,与模板中的定义相对应的声明被视为定义

因为在第一个代码中,成员枚举是非范围的,因此
A
的隐式实例化也将隐式实例化
enum E
定义。相反,在第二种情况下,
Test
是一个成员类,因此专门化
a
的隐式实例化只会导致成员类
Test
声明的隐式实例化,而不是
定义

作为第一个代码的变体:

#包括
模板结构A{
枚举E:T;
};
模板枚举A::E:char{
埃卡尔
}; 
模板枚举A::E:int{/#1
埃卡尔
}; 
int main(){
}
与第一个代码不同的是,它的封闭主类模板的成员枚举
E
没有定义,在主类模板
A
中,它只是一个声明

因此,我认为[temp.expl.spec#6]中的规则并不明确。正如上面这些代码所示,在每种情况下,主类模板的专门化都会导致类成员的隐式实例化,区别在于一个是声明的隐式实例化,另一个是定义

因此,我认为修改规则如下:

如果一个模板、一个成员模板或一个类模板的一个成员被显式地专门化,那么该专门化应在第一次使用该专门化之前声明,该专门化将导致从对应实体的定义中实例化的定义的隐式实例化,在发生此类使用的每个翻译单元中;无需诊断

它将符合可观察到的结果。如果我遗漏了什么,请纠正我