正在检查是否有const类型

Checking whether we have a const type

本文关键字:const 类型 是否 检查      更新时间:2023-10-16

我有以下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的第二次调用没有看到常量,而对重载的调用却看到了常量

有什么想法吗?

这个问题与这个问题高度相关:在模板函数和常量限定符中键入演绎,但仍然有点不同。

您似乎混淆了constness的级别。

is_const正确地报告该类型缺少顶级常量(如果合法,则const char&const为true)。

您的重载匹配常量为&的正确函数;。

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

关于顶级const的话已经在评论和其他答案中说过了。如何获得您可能想要看到的内容:使用std::remove_reference

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