Рассмотрим следующий код:
#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&&
являются ссылками, но не оба значения r.
Аналогично, в inc2
, x
имеет тип int&
, потому что снова оба int&
и T&
являются ссылками, но не оба значения r.
Мой вопрос о y
: почему в inc1
, y
имеет тип int&
, а в inc2
, y
имеет тип int
?
Я наблюдал это как на gcc 4.8.1, так и на microsoft v110 и v120_ctp.