Почему мой конструктор с неконстантной ссылкой в ​​качестве аргумента разрешен для вызова с временными объектами?

У меня есть пример кода ниже.

#include<iostream>

template<typename T>
class XYZ
{
   private:
   T & ref;
   public:
   XYZ(T & arg):ref(arg)
   {
   }
};
class temp
{
   int x;
   public:
   temp():x(34)
   {
   }
};
template<typename T>
void fun(T & arg)
{
}
int main()
{
   XYZ<temp> abc(temp());
   fun(temp());  //This is a compilation error in gcc while the above code is perfectly valid. 
}

В приведенном выше коде, хотя конструктор XYZ принимает аргумент как неконстантную ссылку, он компилируется нормально, в то время как функция fun не компилируется. Это специфично для компилятора g ++ или стандарта С ++, чтобы об этом что-то сказать?

Edit:

g ++ -v дает это.

gcc версии 4.5.2 (Ubuntu / Linaro 4.5.2-8ubuntu4)

7
задан fredoverflow 7 June 2011 в 16:30
поделиться