decltype如何工作?

时间:2016-02-02 05:58:42

标签: c++ c++11 decltype

仅在编译时评估?它看起来是什么是表达式类型或它的返回类型而只是替代它?即它是否作为宏预处理器替换?如果我写这个:

std::map<std::string, int> m;
decltype(m.cbegin()) i;

它是否会实际调用cbegin,我会在这里支付一些费用吗?

编辑:我已经知道我可以写decltype(m)::const_iterator i;

2 个答案:

答案 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