суббота, 24 декабря 2011 г.

Using-declaration из стандарта

Пост из серии "Занимательный стандарт". Листав раздел Using-declaration стандарта по плюсам (тот, что 2003) неожиданно открыл для себя следующую вещь: оказывается одной using-декларацией можно определить в текущем неймспейсе несколько функций с одним именем, но разными параметрами. Но еще тут же можно прибавить ряд функций с таким же именем и перекрывающимися типа аргументов. Ошибкой это вроде как не будет, но вот если вызовите функцию, которая будет конфликтовать с другой (тоже добавленной при помощи using-declaration), то это уже ошибка. Сказанное пояснит пример:
namespace B { 
  void f(int); 
  void f(double); 
} 
namespace C { 
  void f(int); 
  void f(double); 
  void f(char); 
} 

void h() 
{ 
  using B::f; //B::f(int)и B::f(double) 
  using C::f; //C::f(int), C::f(double) и C::f(char) 
  f(’h’);     //вызовется C::f(char) 
  f(1);       //ошибка: неоднозначность: 
              //B::f(int) или C::f(int)? 
  void f(int);//ошибка: 
              //f(int)конфликтует с C::f(int) 
              //и B::f(int) 
}

проверил на gcc - сущая правда.

Комментариев нет:

Отправить комментарий