该代码可以编译吗?
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,但显然没有被接受
答案 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,这意味着模板案例是为了编译。
起草:工作组已达成非正式共识,并在暂定决议中粗略描述,尽管 目前尚无法提供有关变更的准确措辞。