正在检查是否有const类型
Checking whether we have a const type
我有以下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* const
和const char*const
尝试同样的操作,可以更好地查看级别。
关于顶级const的话已经在评论和其他答案中说过了。如何获得您可能想要看到的内容:使用std::remove_reference
std::is_const<std::remove_reference<const char&>::type>::value
相关文章:
- 在函数中使用运算符重载,在 c++ 中使用 const 类型输入参数
- 成员函数的"this"参数具有"const"类型,但我的函数实际上不是"const"
- 将 const 类型引用对象注册为类成员对象C++
- 为什么不能在模板函数中向局部变量添加低级 const 类型
- 对于 const 类型,没有可行的重载运算符 []
- 为什么在auto和template函数的情况下,类型都没有推导为"const"类型
- 如何在OOP C 中使用const类型类
- 特征矩阵const类型
- 如何在静态方法中返回const类型
- const类型容器的const_iterator类型
- C++:当返回类成员变量的地址时,编译器强制其为const *类型
- 类型绑定引用中的限定符和 const 类型的初始值设定项中删除
- 在 main 中初始化类的 "static const" 类型变量成员的更好方法
- 正在检查是否有const类型
- 为什么我们能够在类定义中定义[static const int],而不能定义其他静态const类型
- 了解一些涉及 const 类型的C++代码
- c++ 11中的const类型转换为const别名
- 为什么将const类型的智能指针强制转换为类型的智能指针有效?
- STL:为"const T &"类型调用带有ptr_fun的 bind2nd
- 我应该什么时候传递"T* const&"类型的指针?