【发布时间】:2016-02-02 05:58:41
【问题描述】:
是否仅在编译时进行评估?它看起来是什么表达式类型或它的返回类型并只是替换它? IE。它可以用作宏预处理器替换吗?另外,如果我写了这个:
std::map<std::string, int> m;
decltype(m.cbegin()) i;
它实际上会调用cbegin 并且我会在这里支付一些性能吗?
编辑:我已经知道我可以写decltype(m)::const_iterator i;
【问题讨论】:
是否仅在编译时进行评估?它看起来是什么表达式类型或它的返回类型并只是替换它? IE。它可以用作宏预处理器替换吗?另外,如果我写了这个:
std::map<std::string, int> m;
decltype(m.cbegin()) i;
它实际上会调用cbegin 并且我会在这里支付一些性能吗?
编辑:我已经知道我可以写decltype(m)::const_iterator i;
【问题讨论】:
decltype 严格在编译时工作。因此,您可以将它与取消引用 end 迭代器的代码一起使用,或者使用
decltype(sqrt(-1.))
绝对没有与此相关的运行时惩罚 - 它根本不会被执行。
顺便提一下,关于您的评论:
您应该将decltype 与返回某个值的表达式一起使用。有点讽刺的是,decltype(m)::const_iterator i; 不是一个返回值的表达式——它是一个值的定义。
【讨论】:
int a = 1; decltype(a) b = 2;。在这里,我们没有返回一些值的表达式,而是定义了一个名为 b 的变量。
decltype(a),但不能写decltype(int a)——这就是我想要表达的意思。希望清除它。
我不能写 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++ 编译这个 sn-p well。
【讨论】: