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

NoS*_*tAl 0 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)
        //...
    }
Run Code Online (Sandbox Code Playgroud)

Fre*_*Foo 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";
}
Run Code Online (Sandbox Code Playgroud)

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


Xeo*_*Xeo 6

安全的,因为sizeof(...)不评估内部表达式.对于sizeof(和类似的decltype,typeid和其他类似的结构),只有类型很重要.这个值没有意义(在编译时如何才能对值感兴趣?),这就是为什么不需要评估表达式的原因.甚至取消引用空指针在未评估的上下文中也是安全的.