如何获得vector :: value_type的sizeof?

Chr*_*ris 23 c++ vector sizeof value-type c++11

我想得到sizeof一个向量中包含的类型.这是我尝试过的:

#include <iostream>
#include <vector>

int main()
{
    std::vector<uint> vecs;
    std::cout << sizeof(vecs.value_type) << std::endl;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

根据我的理解,这应该是正确的.但是,在使用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;
                           ^

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

Tem*_*Rex 15

3.4.3限定名称查找[basic.lookup.qual]

1可以在:: scope resolution运算符(5.1)应用于表示其类,名称空间或枚举的嵌套名称指定符之后引用类或命名空间成员或枚举数的名称.如果嵌套名称指定符中的:: scope resolution运算符之前没有decltype-speci fi er,则查找此前面的名称::仅考虑其专门化为类型的名称空间,类型和模板.如果找到的名称未指定名称空间或类,枚举或依赖类型,则程序格式错误.

在这种情况下,您正在type从类模板特化中访问成员std::vector<uint>,您需要通过编写以下内容来完成:

std::vector<uint>::value_type
Run Code Online (Sandbox Code Playgroud)

如果您实际上是在模板化代码中并且想要访问相同的嵌套类型,则需要在其前面添加如下关键字typename:

typename std::vector<T>::value_type
Run Code Online (Sandbox Code Playgroud)

在C++ 11中,你可以使用sizeof(decltype(vecs)::value_type)或者sizeof(decltype(vecs.back())),如果你不知道类型的确切名称但是知道如何通过类似的成员函数访问它们,后者很方便back().

注意:正如@Casey在评论中指出的那样,decltype需要剥离引用以获取类型本身,但是对于sizeof目的而言并不重要.

  • Nit:`decltype(vecs.back())`是`decltype(vecs):: value_type&`并且需要使用`std :: remove_reference`或`std :: decay`进行剥离才能获得纯类型. (5认同)
  • 由于可以将`sizeof()`传递给表达式,而不仅仅是类型,因此不必使用`decltype()`将表达式转换为其类型。例如,`sizeof('x')`照原样有效,无需编写`sizeof(decltype('x'))`。这导致我认为是对原始问题的最佳答案。使用sizeof(vecs [0])获取大小。在这种未评估的上下文中使用std :: vector :: operator []是绝对安全的。它非常简洁,适用于向量,其他容器,甚至C数组或指针。例如,在一个模板中,`vecs`的类型可能是矢量以外的很多东西。 (2认同)

Mik*_*our 9

成员访问运算符.只能用于访问类的数据成员和成员函数,而不能用于访问类型名称等其他嵌套名称.你需要的范围解析运算符::来访问他们,并且只能适用于类名(或别名),而不是类类型的对象:

std::vector<uint>::value_type
Run Code Online (Sandbox Code Playgroud)

在C++ 11或更高版本中,decltype如果您有一个对象且无法方便地访问该类型,则可以为您提供类型名称:

decltype(vecs)::value_type
Run Code Online (Sandbox Code Playgroud)


Tre*_*ith 7

我更喜欢简洁的:

sizeof(vecs[0])
Run Code Online (Sandbox Code Playgroud)

乍一看似乎不安全,因为当vecs长度为零时会发生什么?

对于sizeof()在值类型上调用 operator的参数的这个示例,运算sizeof()符在编译时执行,因此vecs[0]永远不会导致段错误或崩溃。

pssizeof()仅在参数是可变长度数组(来自 C 或 GNU C++ 扩展)时在运行时进行评估