【问题标题】:sizeof of template class模板类的大小
【发布时间】:2013-11-18 19:49:36
【问题描述】:
template<int N>
struct S
{
    void foo()
    {
        sizeof( S ); // (*)
        sizeof( S<N> );
    }
};

int main()
{
    S<5> s;
    s.foo();
    return 0;
}

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

【问题讨论】:

    标签: c++ templates sizeof


    【解决方案1】:

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

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

    如果您在S 的定义之外执行sizeof(S),则将是错误。

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:

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

        在类模板特化或部分的范围内 专业化, 当注入的类名是 后面不带.

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

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

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

        【讨论】:

          【解决方案4】:

          在模板中,模板名也是注入的类名,指的是类类型S&lt;N&gt;而不是模板;在类成员函数中,即使函数是在类内部定义的,类类型也是完整的。所以两者都是有效的并且彼此等价。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2018-08-03
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2010-10-03
            相关资源
            最近更新 更多