次のコードを検討してください。
#include <iostream>
template<typename T>
void inc1(T&& x)
{
T y = x;
++y;
}
template<typename T>
void inc2(T& x)
{
T y = x;
++y;
}
int main()
{
int a = 10;
inc1(a); // a is now 11
int b = 10;
inc2(b); // b remains 10
}
置換後、
void inc1(int& x)
{
int& y = x; // reference to x
++y; // increments x
}
void inc2(int& x)
{
int y = x; // copy of x
++y; // increments the copie
}
ではinc1
、との両方が参照ですが、両方が右辺値ではないため、x
は型です。int&
int&
T&&
同様に、 ininc2
はx
typeです。これも、とのint&
両方が参照ですが、両方が右辺値であるわけではないためです。int&
T&
私の質問は次のy
とおりです。なぜ inは typeinc1
であるのに対し、 inはtype なのですか?y
int&
inc2
y
int
これは、gcc 4.8.1 と Microsoft v110 および v120_ctp の両方で観察されました。