Re: Кто нибудь понимает код STL от MS?
От: Pavel Dvorkin Россия  
Дата: 22.09.14 14:58
Оценка: :)
Здравствуйте, Juster, Вы писали:

J>Я когда туда заглядываю, мне сразу закрыть хочется. Такое ощущение, что код был создан авто-генератором каким-то, форматирование неудобное, имена жутко запутанные, структура довольно сложная. Кто-то в этом разбирается?


Компилятор.
With best regards
Pavel Dvorkin
Re[7]: Кто нибудь понимает код STL от MS?
От: B0FEE664  
Дата: 22.09.14 22:29
Оценка:
Здравствуйте, Кодт, Вы писали:

  Скрытый текст
К>
К>namespace aux // откуда мы знали, что это имя задействовано в STL?
К>{
К>  struct bar {...};

К>  void quick_sort(bar* x, bar* y) // "упорядочим два элемента по-быстрому" - откуда мы знали, что это имя значит что-то иное в std::aux ?
К>  {
К>    if(x->key > y->key) { quick_swap(x->key, y->key); quick_swap(x->value, y->value); }
К>  }
К>}
К>


К>Не буду сейчас лазить в потроха реального STL, просто покажу на примере, где может аукнуться

К>
К>namespace std
К>{
К>  namespace aux
К>  {
К>    template<class It> void insertion_sort(It i, It j) { ..... }
К>    template<class It> void quick_sort    (It i, It j) { ..... }
К>  }

К>  // интерфейсная функция
К>  template<class It>
К>  void sort(It i, It j)
К>  {
К>    if(distance(i,j) < some_treshold)
К>      aux::insertion_sort(i,j);
К>    else
К>      aux::quick_sort(i,j);
К>  }
К>}
К>

К>Если кто-то кое-где определил для своих нужд
К>чуть выше точки включения #include <algorithm>
К>то у нас посыплется сортировка std::vector<aux::bar> в релизной сборке.

Да с чего бы ей сыпаться? Да и от сборки как это может зависить?

namespace aux // откуда мы знали, что это имя задействовано в STL?
{
  struct bar {...};

  void quick_sort(bar* x, bar* y) // "упорядочим два элемента по-быстрому" - откуда мы знали, что это имя значит что-то иное в std::aux ?
  {
    if(x->key > y->key) { quick_swap(x->key, y->key); quick_swap(x->value, y->value); }
  }
}

namespace std
{
  namespace aux
  {
    template<class It> void quick_sort    (It i, It j) { ..... }
  }

  // интерфейсная функция
  template<class It>
  void sort(It i, It j)
  {
      aux::quick_sort(i,j); // это однозначно std::aux::quick_sort, так как aux продикларирована до и находится внутри
  }
}



  aux::bar* pA = NULL;
  aux::bar* pB = NULL;
  std::sort(pA, pB); // вызовет std::aux::quick_sort


А вот если сказать:
  using namespace std;
  using namespace std::aux;
  ::aux::bar* pA = NULL;
  ::aux::bar* pB = NULL;
  quick_sort(pA, pB); // вызовет ::aux::quick_sort
  quick_sort(NULL, NULL); // вызовет std::aux::quick_sort

то да, есть некая неожиданность. Но сыпаться —
И каждый день — без права на ошибку...
Re[8]: Кто нибудь понимает код STL от MS?
От: Кодт Россия  
Дата: 23.09.14 08:20
Оценка: 6 (1)
Здравствуйте, B0FEE664, Вы писали:

BFE>Да с чего бы ей сыпаться? Да и от сборки как это может зависить?

BFE>А вот если сказать:

Безо всяких using-хаков
#include <cstdio>

namespace aux {
    struct foo {};
    void quick_sort(foo* f1, foo* f2) { printf("user-defined function\n"); }
}

namespace sss {
    namespace aux {
        template<class T> void quick_sort(T i, T j) { printf("standard quick sort\n"); }
        template<class T> void sort_impl(T i, T j) { quick_sort(i,j); } // мы же, якобы, внутри родного неймспейса, - не квалифицируем имя
    }

    template<class T> void sort(T i, T j) { aux::sort_impl(i,j); } // здесь имя квалифицированное, компилятор ищет в нужном пространстве
}

int main() {
    aux::foo p,q;
    sss::sort(&p, &q); // "user-defined function"
}

Вот тебе, Эндрю Кёниг, и юрьев день!
Перекуём баги на фичи!
Re[9]: Кто нибудь понимает код STL от MS?
От: B0FEE664  
Дата: 23.09.14 08:34
Оценка:
Здравствуйте, Кодт, Вы писали:

BFE>>Да с чего бы ей сыпаться? Да и от сборки как это может зависить?

BFE>>А вот если сказать:
К>Безо всяких using-хаков

Переставим sss и aux местами:
#include <cstdio>

namespace sss {
    namespace aux {
        template<class T> void quick_sort(T i, T j) { printf("standard quick sort\n"); }
        template<class T> void sort_impl(T i, T j) { quick_sort(i,j); } // мы же, якобы, внутри родного неймспейса, - не квалифицируем имя
    }

    template<class T> void sort(T i, T j) { aux::sort_impl(i,j); } // здесь имя квалифицированное, компилятор ищет в нужном пространстве
}

namespace aux {
    struct foo {};
    void quick_sort(foo* f1, foo* f2) { printf("user-defined function\n"); }
}

int main() {
    aux::foo p,q;
    sss::sort(&p, &q); // "user-defined function"
}


Ничего не изменилось. Но поведение интересное, согласен.
И каждый день — без права на ошибку...
Re[10]: Кто нибудь понимает код STL от MS?
От: Кодт Россия  
Дата: 23.09.14 08:50
Оценка:
Здравствуйте, B0FEE664, Вы писали:

BFE>Ничего не изменилось. Но поведение интересное, согласен.


Тут надо уточнить. ADL — дело тонкое... Я точно не помню, какие там правила попадания в поле зрения.
Когда поле зрения ограничено — от начала файла до точки использования, а когда — от начала до конца файла.
Перекуём баги на фичи!
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.