fog*_*bit 13 c++ templates sizeof
template<int N>
struct S
{
void foo()
{
sizeof( S ); // (*)
sizeof( S<N> );
}
};
int main()
{
S<5> s;
s.foo();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
这段代码编译得很好(VS2010),但我对(*)字符串有疑问.S是不完整的类型,不像S<N>在我看来那么编译器怎么知道它的大小?标准对这种情况说了什么,它是否形成良好sizeof?
AnT*_*AnT 15
S定义里面的名称是struct S指注入的类名 S,根据14.6.1/2(C++ 03)不需要显式的参数列表
在类模板特化或部分特化的范围内,当inject-name-name后面没有<时,它等同于inject-class-name,后跟类模板特化或部分特化的template-arguments.括在<>中.
请注意,如果您故意强制编译器使用范围解析运算符来使用模板的"原始"名称(而不是注入的类名称),则参数列表将成为必需
template<int N>
struct S
{
void foo()
{
sizeof( ::S ); // <- ERROR
sizeof( ::S<N> ); // <- OK
}
};
Run Code Online (Sandbox Code Playgroud)
rig*_*old 11
C++隐式插入using S = S<N>;到类体中,因此这两个语句是等价的.
template<int N>
struct S {
static_assert(std::is_same<S, S<N>>(), "");
};
Run Code Online (Sandbox Code Playgroud)
如果你在定义之外做了,那将是一个错误.sizeof(S)S
| 归档时间: |
|
| 查看次数: |
4107 次 |
| 最近记录: |