代码之家  ›  专栏  ›  技术社区  ›  HolyBlackCat

标准是否认为模板类的非模板成员本身是“模板”?

  •  13
  • HolyBlackCat  · 技术社区  · 6 年前

    考虑下面的代码:

    #include <type_traits>
    
    template <typename T> struct A
    {
        static_assert(!std::is_same_v<int, T>);
    };
    
    template<typename T> struct B
    {
        void foo()
        {
            A<int>{};
        }
    };
    
    int main() {}
    

    它来自 this question 关于俄语StackOverflow,询问它是否有效。

    我试图引用以下内容:

    [temp.res]/8.1

    8. 可以在任何实例化之前检查模板的有效性[注意:知道哪些名称是类型名称,可以通过这种方式检查每个模板的语法。[完注]

    (8.1) 无法为模板生成有效的专门化 或模板中constexpr if语句的子语句,且该模板未实例化,或

    ...

    (强调矿山)

    foo() ,我推断该片段的格式不正确,NDR。

    但是有人告诉我 [temp.res]/8.1 从那以后就不适用了 foo() 它本身不是模板成员函数。

    cppreference 将模板类的非模板成员函数调用为“模板化实体”,但似乎不清楚它们本身是否可以被视为模板。

    因此,问题是:标准是否认为模板类的非模板成员本身是“模板”?

    1 回复  |  直到 4 年前
        1
  •  10
  •   StoryTeller - Unslander Monica    6 年前

    这基本上是 CWG issue 1253

    部分 :17.8[温度规格] :起草 提交人 :尼古拉·伊夫琴科夫 : 2011-03-06

    标准中的许多语句仅适用于模板,例如, 17.7[临时决议]第8段:

    如果无法为模板定义生成有效的专门化, 并且该模板没有实例化,模板定义是

    这显然应该适用于类的非模板成员函数 指的是这些非实际存在的通用实体 模板。

    它似乎仍在起草中。但我认为,就像这个问题一样,OP中的代码 应该 也可能是格式不良的NDR。即使成员函数从未被使用过(因此其完整定义从未被实例化),它仍然无法被假设地实例化,这将其归入错误类别[temp.res]/8的目的是要涵盖的。