做一些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)
//...
}
答案 0 :(得分:11)
是的,这是安全的,但我意识到您可以通过key_type
,mapped_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
(以及类似decltype
,typeid
和其他类似构造),只有类型很重要。该值没有意义(在编译时在编译时如何??),这就是为什么不需要评估表达式的原因。甚至取消引用空指针在未评估的上下文中也是安全的。