首页 文章

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

提问于
浏览
12

考虑以下代码:

#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() {}

它来自俄罗斯StackOverflow上的this question,它询问它是否有效 .

我试图引用这个:

[temp.res] /8.1 8可以在任何实例化之前检查模板的有效性 . [注意:知道哪些名称是类型名称允许以这种方式检查每个模板的语法 . - 结束注释]如果出现以下情况,则程序格式错误,无需诊断:(8.1) - 无法为模板或模板中的constexpr if语句生成有效的特殊化,并且模板未实例化,或者 . ..

(强调我的)

由于无法为 foo() 生成有效的专业化,因此我推断该片段格式不正确,NDR .

但我被告知 [temp.res]/8.1 不适用,因为 foo() 本身不是模板成员函数 .

cppreference调用模板类"templated entities"的非模板成员函数,但似乎不清楚它们是否可以被视为模板本身 .

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

1 回答

  • 8

    这基本上是CWG issue 1253

    通用非模板成员部分:17.8 [temp.spec]状态:起草提交者:Nikolay Ivchenkov日期:2011-03-06标准中的许多陈述仅适用于模板,例如,17.7 [temp.res]第8段:如果无法为模板定义生成有效的特化,并且未实例化该模板,则模板定义格式错误,无需诊断 . 这显然应该适用于类模板的非模板成员函数,而不仅仅适用于模板本身 . 应 Build 术语以引用这些通常不是模板的通用实体 .

    它似乎仍在起草中 . 但我认为,就像这个问题一样,OP中的代码也应该是格式错误的NDR . 即使从不使用成员函数(因此它的完整定义永远不会被实例化),它仍然不能被假设地实例化,这将它置于错误[temp.res] / 8的范畴之下 .

相关问题