2017-02-10 24 views
0

Для общего пути, чтобы найти размер элементов в векторе, это действует:Является ли `sizeof (some_vector [0])` valid?

std::vector<float> some_vector; 
int size = sizeof(some_vector[0]); 

Или это могло привести к проблемам, так как some_vector [0] может быть пустым?

Я предполагаю, что это оценивалось во время компиляции в любом случае, но соответствует ли это стандарту?

+0

Это прекрасно, так что 'sizeof (* static_cast (0))'; – Nawaz

+4

Имейте в виду, что то, что возвращается 'v [0]', может быть не того же типа, что и 'T' в' std :: vector v; '. Например, рассмотрите тип прокси, возвращаемый 'vector '. – BoBTFish

ответ

2

Оператор sizeof используется с неоценимыми выражениями. Таким образом, вы можете использовать это выражение для определения размера элемента вектора.

С С ++ Стандартный (5.3.3 SIZEOF)

1 Оператор SizeOf дает число байтов в представлении объекта его операнда. Операндом является либо выражение, , которое является неоцененным операндом (п. 5), либо идентификатором типа в скобках. Оператор sizeof не должен применяться к выражению , имеющему функцию или неполный тип, к типу перечисления, который базовый тип не фиксируется до того, как все его счетчики были объявлены , с указанным в скобках именем такого типа или значением glvalue , который обозначает бит-поле. sizeof (char), sizeof (signed char) и sizeof (unsigned char) равны 1. Результат sizeof, примененный к любому другому базовому типу (3.9.1), является реализацией. [Примечание: в конкретный размер sizeof (bool), sizeof (char16_t), sizeof (char32_t) и sizeof (wchar_t) определены как реализация.75 -end note] [Примечание: см. 1.7 для определения байта и 3.9 для определения объекта . -end note]