sizeof of template class

时间:2013-11-07 08:44:16

标签: c++ templates sizeof

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

4 个答案:

答案 0 :(得分:14)

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

  

在类模板特化或部分范围内   专业化,   当注入类名时       没有后跟一个&lt;,它相当于注入类名   然后是模板参数       包含在&lt;&gt;。

中的类模板特化或部分特化

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

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

答案 1 :(得分:11)

C ++隐式地将using S = S<N>;插入到类体中,因此这两个语句是等价的。

template<int N>
struct S {
    static_assert(std::is_same<S, S<N>>(), "");
};
如果您在sizeof(S)的定义之外S,则 错误。

答案 2 :(得分:3)

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

答案 3 :(得分:1)

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