仅在编译时评估?它看起来是什么是表达式类型或它的返回类型而只是替代它?即它是否作为宏预处理器替换?如果我写这个:
std::map<std::string, int> m;
decltype(m.cbegin()) i;
它是否会实际调用cbegin
,我会在这里支付一些费用吗?
编辑:我已经知道我可以写decltype(m)::const_iterator i;
答案 0 :(得分:3)
decltype
严格适用于编译时。因此,您可以将其与可以取消引用end
迭代器的代码一起使用,或者使用
decltype(sqrt(-1.))
绝对没有与此相关的运行时惩罚 - 它根本不会被执行。
顺便提一下,关于你的评论:
您应该使用decltype
表达式返回一些值。有点讽刺的是,decltype(m)::const_iterator i;
不是一个返回值的表达式 - 它是一个值的定义。
答案 1 :(得分:1)
我不能写decltype(m):: const_iterator i;
你可以!
std::map<std::string, int> m;
decltype(m)::const_iterator i; // same as std::map<std::string, int>::const_iterator
GNU C ++编译此代码段well。