2012-08-03 25 views
0

同時做一些TMP :) :( 我最終需要STL容器容納的元素的大小 我知道通常deref一個container.begin()迭代器是壞的沒有檢查容器是不是空的,但從什麼我知道的sizeof是編譯時宏,以便我它是安全的 我說得對調用sizeof(* s.begin())是否安全?

代碼段爲:?

for(auto it = t.begin(); it!= t.end(); ++it) 
    { 
     char* cp = (char*)(&(*it)); 
     for (size_t i =0 ; i < sizeof *t.begin();++i) 
     //... 
    } 

回答

11

是的,那是安全的,但要意識到,你可以在存儲類型得到在容器中通過key_typemapped_type和/或value_typetypedef成員。

例如爲:

struct Foo { 
    int bla; 
    double quuxly; 
}; 

int main() 
{ 
    typedef std::vector<Foo> foovector; 
    std::cout << "sizeof(Foo) == " << sizeof(foovector::value_type) << "\n"; 
} 

[sizeof不是,順便說一句。它是建立在語言本身,像++|=操作。]

+0

代替使用'typedef'的+1。添加一個例子;) – 2012-08-03 14:05:23

+0

@ D.Shawley:你去了! – 2012-08-03 14:10:48

6

安全的,因爲裏面sizeof(...)表達不評估。對於sizeof(以及類似的decltype,typeid和其他類似構建體),只有類型很重要。這個值是沒有意義的(在編譯時處,值怎麼會是感興趣的?),這就是爲什麼不需要評估表達式的原因。即使取消引用空指針在未評估的上下文中也是安全的。

+0

+1提供**原因**爲什麼允許(即使在容器空的情況下)。 – 2012-08-03 14:58:08