Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.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++_Templates_C++11_Stl - Fatal编程技术网

C++ 隐式实例化取决于作用域或非作用域枚举

C++ 隐式实例化取决于作用域或非作用域枚举,c++,templates,c++11,stl,C++,Templates,C++11,Stl,14.7.3/6规定如下: 如果模板、成员模板或类模板的成员被显式专门化,则 专业化应在第一次使用该专业化之前声明,该专业化将导致隐式实例化发生,在使用该专业化的每个翻译单元中;无需诊断。如果程序未提供显式专门化的定义,并且专门化的使用方式可能导致隐式实例化,或者成员是虚拟成员函数,则程序的格式不正确,不需要诊断。对于已声明但未定义的显式专门化,永远不会生成隐式实例化 然后给出以下示例: template<class T> struct A { enum E : T;

14.7.3/6规定如下:

如果模板、成员模板或类模板的成员被显式专门化,则 专业化应在第一次使用该专业化之前声明,该专业化将导致隐式实例化发生,在使用该专业化的每个翻译单元中;无需诊断。如果程序未提供显式专门化的定义,并且专门化的使用方式可能导致隐式实例化,或者成员是虚拟成员函数,则程序的格式不正确,不需要诊断。对于已声明但未定义的显式专门化,永远不会生成隐式实例化

然后给出以下示例:

template<class T> struct A
{
    enum E : T;
    enum class S : T;
};

template<> enum A<int>::E : int { eint };       // OK

template<> enum class A<int>::S : int { sint }; // OK

template<class T> enum A<T>::E : T { eT };

template<class T> enum class A<T>::S : T { cT };

template<> enum A<char>::E : char { echar }; // ill-formed, A<char>::E was instantiated
                                             // when A<char> was instantiated

template<> enum class A<char>::S : char { schar }; // OK
模板结构A
{
枚举E:T;
枚举类S:T;
};
模板枚举A::E:int{eint};//好啊
模板枚举类A::S:int{sint};//好啊
模板枚举A::E:T{eT};
模板枚举类A::S:T{cT};
模板枚举A::E:char{echar};//格式错误,实例化了A::E
//当一个实例被实例化时
模板枚举类A::S:char{schar};//好啊

我不明白它是如何编译最后一行的,而不是它前面的那一行。我预计这两个示例都会失败,因为
A::E
A::S
都被隐式实例化。我注意到,当我从主模板中
S
的枚举键中删除
class
时,最后一行失败,并显示与另一行相同的消息。为什么会发生这种情况?

类模板的隐式实例化隐式实例化非作用域成员枚举的定义,但仅实例化作用域成员枚举的声明

§14.7.1[温度仪表]/p1(增加强调):

类模板专门化的隐式实例化会导致 声明的隐式实例化,但不是 的定义、默认参数或异常规范 类成员函数,成员类,作用域成员 枚举、静态数据成员和成员模板;而且 导致未范围定义的的隐式实例化 成员枚举和成员匿名联合

@T.C.代码段中哪里有实例化的?