如何获得vector :: value_type的大小?

时间:2014-01-22 18:21:53

标签: c++ c++11 vector sizeof value-type

我想获得向量中包含的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;
                           ^

我做错了什么?如何获得所包含类型的大小?

4 个答案:

答案 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()