我想获得向量中包含的sizeof
类型。这是我试过的:
#include <iostream>
#include <vector>
int main()
{
std::vector<uint> vecs;
std::cout << sizeof(vecs.value_type) << std::endl;
return 0;
}
根据我的理解,这应该是正确的。但是,在使用GCC 4.8.1进行编译时,这就是我得到的:
test-sizeof.cpp: In function ‘int main()’: test-sizeof.cpp:7:27: error: invalid use of ‘std::vector<unsigned int>::value_type’ std::cout << sizeof(vecs.value_type) << std::endl; ^
我做错了什么?如何获得所包含类型的大小?
答案 0 :(得分:14)
3.4.3 Quali fi ed name lookup [basic.lookup.qual]
1类或命名空间成员或枚举器的名称可以是 在:: scope resolution operator(5.1)应用于a之后引用 nested-name-speci fi er,表示其类,名称空间或 列举。如果是:: scope解析运算符 nested-name-speci fi er之前没有decltype-speci fi er,查找 之前的名称::仅考虑名称空间,类型,和 专业化类型为的模板。如果找到的名称没有 指定命名空间或类,枚举或依赖类型, 节目形成不良。
在这种情况下,您正在从类模板专业化type
访问std::vector<uint>
成员,您需要通过以下方式来访问:
std::vector<uint>::value_type
如果您实际上是在模板化代码中,并希望例如访问相同的嵌套类型,您需要在其前面添加关键字typename
,如下所示:
typename std::vector<T>::value_type
在C ++ 11中,您可以使用sizeof(decltype(vecs)::value_type)
或sizeof(decltype(vecs.back()))
,如果您不知道类型的确切名称但知道如何通过成员访问它们,后者很方便功能类似于back()
。
注意:正如@Casey在评论中指出的那样,decltype
需要剥离引用以获取类型本身,但是对于sizeof目的而言并不重要。
答案 1 :(得分:9)
成员访问运算符.
只能用于访问类的数据成员和成员函数,而不能用于其他嵌套名称(如类型名称)。您需要范围解析运算符::
来访问它们,并且只能应用于类名(或别名),而不是类类型的对象:
std::vector<uint>::value_type
在C ++ 11或更高版本中,decltype
可以为您提供类型名称,如果您有对象且无法方便地访问该类型:
decltype(vecs)::value_type
答案 2 :(得分:3)
评论几乎说了一切:如果你知道矢量的类型,你可以使用sizeof(std::vector<uint>::value_type)
。否则使用sizeof(decltype(vecs)::value_type)
。
decltype
是一个神奇的C ++ 11结构,它根据参数的类型求值,所以代码
int i;
float f;
decltype(i) j;
decltype(f) g;
与
相同int i;
float f;
int j;
float g;
仅对字段和方法使用.
运算符(从技术上讲,它也可以用于静态变量,但它被认为是不好的做法)。对于其他任何内容,例如静态变量,内部类或类范围模板参数或typedef(例如value_type
),请使用范围解析运算符::
。
答案 3 :(得分:2)
我更简洁:
sizeof(vecs[0])
乍一看似乎不安全,因为当vecs
是零长度向量时会发生什么?
在此示例中,在值类型上调用sizeof()
运算符的参数时,sizeof()
运算符在编译时执行,因此vecs[0]
绝不会导致段错误或崩溃。
p.s。仅当参数为可变长度数组(来自C或GNU C ++扩展名)时,才在运行时评估sizeof()