0

在做一些 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)
        //...
    }
4

2 回答 2

11

是的,这很安全,但要意识到您可以通过key_type,mapped_type和/或value_type typedef成员获取存储在容器中的类型。

例如:

struct Foo {
    int bla;
    double quuxly;
};

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

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

于 2012-08-03T14:03:34.940 回答
6

安全的,因为里面的表达式sizeof(...)没有被计算。对于sizeof(以及类似地decltypetypeid以及其他类似的构造),只有类型很重要。该值是不感兴趣的(在编译时一个值怎么可能是感兴趣的?),这就是为什么不需要评估表达式的原因。即使在未评估的上下文中取消引用空指针也是安全的。

于 2012-08-03T14:09:28.600 回答