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オーバーロードの呼び出しでは constness が表示されるのに、2 番目の呼び出しでは constness が表示されないのはなぜだろうと思っています。

何かご意見は?

この質問は 、テンプレート化された関数と const 修飾子の型推論と非常に関連していますが、それでも少し異なります。

4

2 に答える 2

2

constness のレベルを混同しているようです。

is_const は、型に最上位の const がないことを正しく報告します (const char&const正当な場合は true になります)。

あなたのオーバーロードは、constness left to & の正しい関数と一致します。

char*ポインター 、 、const char*char* constおよびconst 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 に答える