3

我有以下 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 qualifier但还是有点不同。

4

2 回答 2

2

您似乎混淆了 constness 的级别。

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

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

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

于 2013-06-27T11:39:10.640 回答
1

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

std::is_const<std::remove_reference<const char&>::type>::value
于 2013-06-27T11:40:50.667 回答