在做一些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不是宏观,顺便说一下.它是一种内置于语言本身的运算符,如++或|=.
这是安全的,因为sizeof(...)不评估内部表达式.对于sizeof(和类似的decltype,typeid和其他类似的结构),只有类型很重要.这个值没有意义(在编译时如何才能对值感兴趣?),这就是为什么不需要评估表达式的原因.甚至取消引用空指针在未评估的上下文中也是安全的.