На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
Модераторы: Qraizer, Hsilgos
  
> {} и неопределенность перегрузки функций
    Всем привет. Кто-то может объяснить это с т. з. Стандарта?
    https://ideone.com/KiYNWi
    ExpandedWrap disabled
      #include <iostream>
      #include <string>
      #include <vector>
       
      void f(const std::string& x)
      {
          std::cout << "void f(const std::string& x)";
      }
       
      void f(std::vector<int>* x)
      {
          std::cout << "void f(std::vector<int>* x)";
      }
       
      int main()
      {
          f({});
      }
      Ну... Имеем две сигнатуры f(), одна принимает l-value const reference, вторая указатель. К первой, согласно Reference binding, может быть применено identical conversion, был бы какой-нибудь r-value типа std::string. Чтобы иметь std::string, нужен подходящий конструктор, принимающий {}. Их два: принимающий const std::string::value_type* и принимающий std::initializer_list<std::string::value_type>. Оба могут быть использованы, но для первого требуется user defined conversion, а второй identity conversion, поэтому отбирается он. Однако он имеет (List-initialization sequence) ранг worst при наличии других одинаково подходящих сигнатур.
      Для второй сигнатуры {} рассматривается как value initialization, которое для указателей является zero initialization как для скалярных. Это identity conversion, которое совпадает с identity conversion для предыдущей сигнатуры, однако, т.к. для той декларируется worst, выбирается т.о. вторая сигнатура.
        Qraizer, спасибо.
        0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
        0 пользователей:


        Рейтинг@Mail.ru
        [ Script execution time: 0,0301 ]   [ 17 queries used ]   [ Generated: 19.03.24, 09:58 GMT ]