调用sizeof(* s.begin())安全吗?

时间:2012-08-03 14:01:49

标签: c++ sizeof

做一些TMP :) :( 我最终需要STL容器所拥有的元素的大小。 我知道通常deref一个container.begin()迭代器是坏的,不检查容器是否为空,但据我所知sizeof是编译时宏,所以我它是安全的。 我是对的吗?

代码段是:

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

2 个答案:

答案 0 :(得分:11)

是的,这是安全的,但我意识到您可以通过key_typemapped_type和/或value_type typedef成员获取存储在容器中的类型。< / p>

E.g:

struct Foo {
    int bla;
    double quuxly;
};

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

[sizeof不是,顺便说一下。它是一种内置于语言本身的运算符,如++|=。]

答案 1 :(得分:6)

是安全的,因为sizeof(...)内的表达式未被评估。对于sizeof(以及类似decltypetypeid和其他类似构造),只有类型很重要。该值没有意义(在编译时在编译时如何??),这就是为什么不需要评估表达式的原因。甚至取消引用空指针在未评估的上下文中也是安全的。