首页 文章

模板类的实例化点

提问于
浏览
7

该代码可以编译吗?

#include <iostream>

template <typename T>
struct TMPL
{
    using TP = typename T::TP; //is CL::TP visible (with T == CL)?
};

struct CL
{
    using TP = int;
    TMPL<CL>::TP val; 
};

int main()
{
    CL cl;
}

根据标准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 回答

  • 2

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

    6在声明类成员之后,可以在其类的范围内查找成员名称 . [注意:即使 class 是不完整的 class ,也是如此 . 例如,struct X {
    枚举E
    ;
    int b [X :: z]; // 好
    };

    • 结束说明]

    然后提出的决议:

    在14.6.4.1 [temp.point]第3段中更改:实例化的点紧接在封闭模板的实例化之前 . 否则,这种特化的实例化点紧接在引用特化的命名空间范围声明或定义之前 . 要:实例化的点与封闭模板的实例化点相同 . 否则,这种专业化的实例化点将紧接在最近的封闭声明之前 . [注意:实例化的重点仍然是命名空间范围,但实例化之前的任何声明,即使不在命名空间范围内,都被视为已被看到 . ]添加以下第3段:如果隐式实例化类模板专门化,类成员特化或类模板的特化引用类,类模板特化,类成员特化或类模板的特化,包含直接或间接导致实例化的特化引用,类引用的完整性和排序要求是应用于专业化参考的上下文中 .

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

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

相关问题