Выбор между созданием экземпляра шаблона с аргументами указателя

Посмотрите на следующий тестовый код:

template<class T> struct Wrap {};

template<typename T> inline
void fun (T *&Int)          // **choice 1**
{}

template<typename T> inline
void fun (Wrap<T> *&Int)    // **choice 2**
{}

int main()
{
  int i = 6;
  fun((char*&)(i));         // **call 1**
  fun((Wrap<char>*&)(i));   // **call 2**
}

Когда я запускаю этот код в linux g ++, он работает, как и ожидалось. Когда fun () вызывается с помощью char * &, он вызывает функцию выбора 1 напрямую. Однако меня интересует, когда мы вызываем fun () с помощью Wrap * &, и он вызывает выбор 2. Хотя оба варианта 1 и 2 кажутся действительными для второго вызова, компилятору удается выбрать немного лучшего соперника -> вариант 2 (потому что он существует.)

Вопрос : Гарантируется ли, что такое же поведение будет сохранено для любого другого компилятора для C ++? Если нет, то есть ли другая альтернатива, чтобы сделать его детерминированным?

5
задан iammilind 28 March 2011 в 08:59
поделиться