【问题标题】:Checking whether we have a const type检查我们是否有一个 const 类型
【发布时间】:2013-06-27 11:35:33
【问题描述】:

我有以下 c++11 代码:

#include <iostream>
#include <type_traits>

template<typename T> void overload(T&& t);
template<> void overload<char&>(char& t) { std::cout << "char& called" << std::endl; }
template<> void overload<const char&>(const char& t) { std::cout << "const char& called" << std::endl; }

int main() {

    std::cout << "const char: " << ((std::is_const<const char>::value)?"const":"non-const") << std::endl;
    std::cout << "const char&: " << ((std::is_const<const char&>::value)?"const":"non-const") << std::endl;

    const char c = 'c';
    overload(c);

    return 0;
}

跑步时我得到

const char: const
const char&: non-const
const char& called

我想知道为什么对 std::is_const 的第二次调用没有看到常量,而对重载的调用却看到了它。

有什么想法吗?

这个问题与这个问题高度相关: Type deduction in templated functions and const quailifier 但还是有点不同。

【问题讨论】:

    标签: c++ templates type-deduction


    【解决方案1】:

    您似乎混淆了 constness 的级别。

    is_const 正确报告该类型缺少顶级 const(如果合法,const char&amp;const 将是 true)。

    您的重载与 & 的 constness 上的正确函数相匹配。

    用指针char*const char*char* constconst char*const 尝试相同的操作,以更好地查看级别。

    【讨论】:

    • 谢谢!这就是我需要的提示。还要感谢其他 cmets。
    【解决方案2】:

    在 cmets 和其他答案中已经说过关于顶级 const 的内容。如何获得您可能希望看到的内容:使用std::remove_reference

    std::is_const<std::remove_reference<const char&>::type>::value
    

    【讨论】:

      猜你喜欢
      • 2015-12-12
      • 2023-04-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-30
      • 2011-01-11
      相关资源
      最近更新 更多