模板类的大小

sizeof of template class

本文关键字:      更新时间:2023-10-16
template<int N>
struct S
{
    void foo()
    {
        sizeof( S ); // (*)
        sizeof( S<N> );
    }
};
int main()
{
    S<5> s;
    s.foo();
    return 0;
}

这段代码编译得很好(VS2010),但我对字符串(*)疑问。 S不是完整的类型,不像S<N>在我看来,编译器怎么知道它的大小呢?标准对这种情况有什么规定,它是否格式正确sizeof

struct S定义中S的名称是指注入的类名S,根据 14.6.1/2 (C++03) 不需要显式参数列表

在类模板专用化或部分范围内 专业化 当注入的类名为 不后跟<,它等效于注入的类名 后跟模板参数 类模板专用化或包含在<>中的部分专用化。

请注意,如果使用范围解析运算符故意强制编译器使用模板的"原始"名称(而不是注入的类名),则参数列表将成为必需的

template<int N>
struct S
{
    void foo()
    {
        sizeof( ::S );    // <- ERROR
        sizeof( ::S<N> ); // <- OK
    }
};
C++将

using S = S<N>;隐式插入到类主体中,因此这两个语句是等效的。

template<int N>
struct S {
    static_assert(std::is_same<S, S<N>>(), "");
};

如果您在S的定义之外进行sizeof(S),那将是一个错误。

在模板中,模板名称也是注入的类名,并且引用类类型S<N>而不是模板;在类成员函数中,即使函数在类中定义,类类型也是完整的。因此,两者都是有效的,并且彼此等价。

模板的成员函数在被调用之前不会实例化。到那时,该类已经实例化,编译器将拥有计算其大小所需的所有信息。

相关文章:
  • 没有找到相关文章