模板类的实例化点

时间:2016-06-10 07:47:53

标签: c++ templates c++14 instantiation name-resolution

该代码可以编译吗?

SQL> alter table yourTable drop column c;

Table altered.

SQL> select * from yourView;
select * from yourView
              *
ERROR at line 1:
ORA-04063: view "ALEK.YOURVIEW" has errors


SQL> create or replace view yourView as select * from yourTable;

View created.

SQL> select * from yourView;

         A          B
---------- ----------
         1          2
        10         20

根据标准14.6.4.1/4

,在CL类定义之前立即实例化TMPL
  

对于类模板特化,...,如果专业化是   隐式实例化,因为它是从另一个内部引用的   模板专业化,.... 否则,实例化点   对于这样的特化,紧接在命名空间范围之前   涉及专业化的声明或定义。

因此,CL :: TP在TMPL实例化点中不可见,但所有编译器(MSVC,gcc,clang)都编译得很好。我也找到了一份缺陷报告http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_active.html#287,但显然没有被接受

1 个答案:

答案 0 :(得分:2)

您的示例与defect report中的示例不同。在缺陷报告中,CL是一个类模板。但是,提议的解决方案的目的是使模板案例与非模板案例相同,即[basic.scope.pdecl]

  

6在声明类成员之后,成员名称   可以在同类的范围内查找。 [注意:这是真的   即使班级是不完整的班级。例如,

struct X {
  enum E { z = 16 };
  int b[X::z];      // OK
};
     

- 结束记录]

然后提出决议:

  

在14.6.4.1 [temp.point]第3段改变:

     

实例化的重点紧接在之前   封闭模板的实例化。否则,重点   这种专业化的实例化紧接着   命名空间范围声明或引用的定义   专业化。

     

要:

     

实例化的点与相同   封闭模板的实例化。否则,重点   这种专业化的实例化紧接着   最近的封闭声明。 [注意:实例化的重点仍然是命名空间范围,但是在点之前的任何声明   实例化,即使不在命名空间范围内,也被认为具有   被人看见了。]

     

添加以下第3段:

     

如果一个隐式实例化的类模板专门化,类   成员专业化或类模板的专业化   引用类,类模板特化,类成员   包含a的类模板的特化或特化   直接或间接引起的专业化参考   实例化,完整性和排序的要求   类引用应用于特化的上下文中   参考

截至最新的draft,非模板案例仍然有效。模板案例不是。但是缺陷是drafting,这意味着模板案例是为了编译。

  

起草:工作组已达成非正式共识,并在暂定决议中粗略描述,尽管   目前尚无法提供有关变更的准确措辞。