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 是如何工作的?的主要内容,如果未能解决你的问题,请参考以下文章