我有以下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但仍然有点不同。
答案 0 :(得分:2)
你似乎混淆了常量的等级。
is_const正确报告该类型缺少顶级const(const char&const
如果合法则为真)。
你的重载符合左边的常量函数&amp;。
使用指针char*
,const char*
,char* const
和const char*const
尝试相同的操作,以更好地查看关卡。
答案 1 :(得分:1)
在评论和其他答案中已经说过关于顶级const的内容。如何获得您可能希望看到的内容:使用std::remove_reference
std::is_const<std::remove_reference<const char&>::type>::value