C++ 检查是否有常量类型
我有以下c++11代码:C++ 检查是否有常量类型,c++,templates,type-deduction,C++,Templates,Type Deduction,我有以下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; } t
#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;
}
我想知道为什么对std::is_const的第二次调用没有看到常量,而对重载的调用却看到了常量
有什么想法吗
这个问题与这个问题高度相关:
但还是有点不同。你似乎混淆了常数的级别 is_const正确地报告该类型缺少顶级常量(
const char&const
如果合法,则为true)
您的重载与常量左至&上的正确函数相匹配
用指针、
char*
、const char*
、char*const
和const char*const
尝试同样的方法,以便更好地查看级别。关于顶级const的内容已在注释和其他答案中说明。如何获得您可能希望看到的内容:使用std::remove\u reference
std::is_const<std::remove_reference<const char&>::type>::value
std::is_const::value
谢谢!这就是我需要的提示。还要感谢其他评论。
std::is_const<std::remove_reference<const char&>::type>::value