Thursday 21 July 2016

c++ - How can I get sizeof a vector::value_type?



I want to get sizeof of the type that is contained in a vector. Here is what I tried:



#include 
#include

int main()
{

std::vector vecs;
std::cout << sizeof(vecs.value_type) << std::endl;
return 0;
}


From my understanding this should be correct. However, when compiling with GCC 4.8.1 this is what I get:



test-sizeof.cpp: In function ‘int main()’:
test-sizeof.cpp:7:27: error: invalid use of ‘std::vector::value_type’

std::cout << sizeof(vecs.value_type) << std::endl;
^


What am I doing wrong? How can I get the size of the contained type?


Answer



3.4.3 Qualified name lookup [basic.lookup.qual]




1 The name of a class or namespace member or enumerator can be
referred to after the :: scope resolution operator (5.1) applied to a

nested-name-specifier that denotes its class, namespace, or
enumeration. If a :: scope resolution operator in a
nested-name-specifier is not preceded by a decltype-specifier, lookup of
the name preceding that :: considers only namespaces, types, and
templates whose specializations are types
. If the name found does not
designate a namespace or a class, enumeration, or dependent type, the
program is ill-formed.




In this case, you are accessing a type member from the class template specialization std::vector, and you need to do it by writing:




std::vector::value_type


In case you are actually inside templated code and want to e.g. access the same nested type, you need to prefix it with the keyword typename like this:



typename std::vector::value_type


In C++11, you can use sizeof(decltype(vecs)::value_type) or also sizeof(decltype(vecs.back())), the latter is convenient if you don't know the precise name of the type but know how to access them through a member function like back().




Note: as pointed out by @Casey in the comments, decltype requires stripping references in order to get the type itself, but for sizeof purposes that doesn't matter.


No comments:

Post a Comment

c++ - Does curly brackets matter for empty constructor?

Those brackets declare an empty, inline constructor. In that case, with them, the constructor does exist, it merely does nothing more than t...