decltype 是如何工作的?

Posted

技术标签:

【中文标题】decltype 是如何工作的?【英文标题】:How does decltype work? 【发布时间】:2016-02-02 05:58:41 【问题描述】:

是否仅在编译时进行评估?它看起来是什么表达式类型或它的返回类型并只是替换它? IE。它可以用作宏预处理器替换吗?另外,如果我写了这个:

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

它实际上会调用cbegin 并且我会在这里支付一些性能吗?

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

【问题讨论】:

【参考方案1】:

decltype 严格在编译时工作。因此,您可以将它与取消引用 end 迭代器的代码一起使用,或者使用

decltype(sqrt(-1.))

绝对没有与此相关的运行时惩罚 - 它根本不会被执行。


顺便提一下,关于您的评论:

您应该将decltype 与返回某个值的表达式一起使用。有点讽刺的是,decltype(m)::const_iterator i; 不是一个返回值的表达式——它是一个值的定义

【讨论】:

感谢 Ami,但我不明白您的最后评论。我可以这样写:int a = 1; decltype(a) b = 2;。在这里,我们没有返回一些值的表达式,而是定义了一个名为 b 的变量。 对,你可以写decltype(a),但不能写decltype(int a)——这就是我想要表达的意思。希望清除它。 您的表达式编译正常:ideone.com/Nzik72 Ideone 使用的是 gcc 5.1,您尝试了哪个编译器? @Anedar 看到这个:***.com/questions/6101728/behavior-of-decltype @Narek:关于该问题的公认答案清楚地表明 C++11 允许您这样做。如果 Visual Studio 的某个版本(或您使用的任何您拒绝命名的编译器)没有,那么它是错误【参考方案2】:

我不能写 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。

【讨论】:

以上是关于decltype 是如何工作的?的主要内容,如果未能解决你的问题,请参考以下文章

c++ 中decltype怎么用?

C++ Primer阅读笔记:decltype

C++ Primer阅读笔记:decltype

decltype类型指示符

decltype总结

decltype类型指示符