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

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

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

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

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

【问题讨论】:

    标签: c++ c++11 decltype


    【解决方案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,您尝试了哪个编译器?
    • @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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-12-31
      • 1970-01-01
      • 1970-01-01
      • 2013-09-19
      • 2023-03-28
      • 1970-01-01
      • 1970-01-01
      • 2019-08-10
      相关资源
      最近更新 更多