普遍的な参照を使用すると、誰かが次のコードタイプ控除
template< typename T >
void check()
{
std::cout << "unknow type" << std::endl;
}
template<>
void check<int>()
{
std::cout << "int" << std::endl;
}
template<>
void check<int&>()
{
std::cout << "int&" << std::endl;
}
template<>
void check<int&&>()
{
std::cout << "int&&" << std::endl;
}
template< typename T >
void bar(T&& a)
{
check<T>();
}
int main()
{
bar(0);
int a = 0;
bar(a);
}
の出力は
int
int&
なく
int&&
int&
である理由私は私の視点から理解するのに役立つことができますがr値参照がr値参照として残っており、l値参照がlval参照として残っている方が直感的ですしかし、l値参照のみがl値参照として残り、r値が非参照値となるように見える。 これの背後にあるモチベーション/アイデアは何ですか?即ちT
専門bar<int>(int&&)
を呼び出しbar(0);
'check'を使っていますが、 'check ';ではありません。どうして明示的に省略したときに' && 'がそこにあると思いますか? –
ildjarn
私は 'bar(0)'が 'bar(0)'と同じであると予想しました。 'bar(0)'の上のコードを 'bar (0)'に置き換えると、出力は実際には 'int && \ n int&'になります。 –
'bar 'のタイプは 'void(T &&)'で、 'bar'のタイプは' void(T && &&) 'です(参照の崩壊前)。 –
Oktalist