2013-06-27 70 views
3

我有以下的C++ 11碼:檢查我們是否有一個const類型

#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第二個電話呢沒有看到const,而重載的調用確實看到它。

有什麼想法?

這個問題與這個問題高度相關: Type deduction in templated functions and const quailifier但還是有點不同。

回答

2

你似乎混淆了不變的水平。

is_const正確地報告該類型缺少頂級常量(如果合法,則爲const char&const)。

你的超負荷匹配正確的功能上的常量左&。

嘗試使用指針char*,const char*,char* constconst char*const來查看更好的級別。

+0

謝謝!這是我需要的暗示。還要感謝其他評論。 – mg84

1

在評論和其他答案中,對頂層const有什麼要說的。你如何得到你可能想看到的:使用std::remove_reference

std::is_const<std::remove_reference<const char&>::type>::value 
相關問題