На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
Модераторы: Qraizer, Hsilgos
Страницы: (78) « Первая ... 45 46 [47] 48 49 ...  77 78  ( Перейти к последнему сообщению )  
> Текущий Стандарт С++ и перспективы его развития
    Да, судя по всему так... Спасибо.
    Печально.
      И то верно. А какой тип должен быть выведен для x? std::initializer_list<int>[2] или int[3][2]?
        Цитата Qraizer @
        А какой тип должен быть выведен для x? std::initializer_list<int>[2] или int[3][2]?

        Почему тебя не смущает, что для
        ExpandedWrap disabled
          auto x = { 1, 2, 3 };

        Он выводит не массив, а std::initializer_list<int>?
        И почему в случае вложенности он не может сделать тоже самое?
          Там ещё пример есть:
          ExpandedWrap disabled
            template<class T> void g(T);
             
            g({1,2,3}); // error: no argument deduced for T
          Толи g<int[]>, толи g<std::initializer_list<int>>
            Ну и да:
            ExpandedWrap disabled
                  auto x = {1, 2, 3};
                  auto y = {1, 2, 3};
                  auto z = {x, y}; // ok


            ExpandedWrap disabled
                  auto z = { {1, 2, 3}, {1, 2, 3} }; // не осилил

            :(
              Цитата D_KEY @
              Он выводит не массив, а std::initializer_list<int>?
              Потому что для этих случаев есть отдельные пункты, а для остальных "the deduced type determined using the rules of template argument deduction from a function call"

              Добавлено
              Думаю, тут дело в неоднозначности намерений программиста. В случае простого auto = {...} всё просто - это braced-init-list, а в случае f({...}} будьте добры явно указать в прототипе f(), что хотите там видеть std::initializer_list<int>.
                Цитата Qraizer @
                Думаю, тут дело в неоднозначности намерений программиста. В случае простого auto = {...} всё просто - это braced-init-list, а в случае f({...}} будьте добры явно указать в прототипе f(), что хотите там видеть std::initializer_list<int>.

                Это понятно. Но у меня то просто auto = {...}. Просто каждый элемент тоже {...}.
                В общем, не нравится мне это решение с плохо связанными между собой auto, decltype и выводом типа шаблона - кто в лес, кто по дрова...
                Но ладно, будем знать.
                Сообщение отредактировано: D_KEY -
                  Ну так auto как раз подразумевает вывод типа компилятором. А у него неоднозначность. Попробуй попользовать typeid().name() или decltype со списком инициализации. Другое дело, если ты явно говоришь int = {}, как и в случае параметров функций (initializer_list<int>) или (int[]). Но ведь auto ж.
                  Сообщение отредактировано: Qraizer -
                    Мне, в первую очередь, не нравится тот пример, что я описал в #695 посте.
                    Очень странно ведет себя "вывод типов", особенно по сравнению с развитыми системами типизации, где вывод типов был всегда...
                    Впрочем, это уже совсем другая тема ;)
                      Там типы x и y уже выведены по правилам braced-init-list для агрегатных объектов, так что для z уже всё известно. Во втором же случае непонятно даже, можно ли рассматривать вложенные {} как агрегатные.
                        Цитата Qraizer @
                        Там типы x и y уже выведены по правилам braced-init-list для агрегатных объектов, так что для z уже всё известно. Во втором же случае непонятно даже, можно ли рассматривать вложенные {} как агрегатные.

                        Это понятно.
                        Не понятно, зачем так было проектировать языковый фичи.
                        У меня такое чувство, что ты меня провоцируешь на оффтоп :D
                          Ну... вот аналогия.
                          ExpandedWrap disabled
                            template <typename T> class complex_number
                            {
                            public:
                              complex_number(T);
                            /* ... */
                            };
                             
                            template <typename T> class array
                            {
                            public:
                              explicit array(std::size_t);
                            /* ... */
                            };
                          Почему во втором случае конструктору нужно указать explicit, а в первом нет?
                          Вот чтобы таких косяков со списками инициализаций не было, потому и не однозначность.
                            Qraizer, мне не понятно, почему auto не может применять свои правила рекурсивно в данном случае.
                              ExpandedWrap disabled
                                int x[][] = { {1, 2, 3}, {4, 5, 6} };


                              Добавлено
                              Уже не знаю, как ещё понятнее рассказать о неоднозначности намерений программиста, имеющей место в данном случае.
                                Цитата Qraizer @
                                Уже не знаю, как ещё понятнее рассказать о неоднозначности намерений программиста, имеющей место в данном случае.

                                ExpandedWrap disabled
                                  auto a = {1, 2, 3, 4, 5, 6} };
                                  auto b = { {1, 2, 3}, {4, 5, 6} };
                                   
                                  auto x = {1, 2, 3};
                                  auto y = {4, 5, 6};
                                  auto z = {x, y};

                                Раз смогли однозначно предложить тип для a, значит можем однозначно предложить тип для b, тем более, если смогли вывести для x, y и z.
                                Это логично.
                                Все остальное - негативное следствие других особенностей языка. Уж лучше бы вообще не выводили тип по auto для {1, 2, 3} - это было бы понятнее.
                                Но это все оффтоп. Можем создать отдельную оффтопную тему про вывод типов :)

                                Добавлено
                                Цитата Qraizer @
                                ExpandedWrap disabled
                                  int x[][] = { {1, 2, 3}, {4, 5, 6} };


                                Это к чему?
                                ExpandedWrap disabled
                                  int x[] = {1, 2, 3, 4, 5, 6};
                                Сообщение отредактировано: D_KEY -
                                0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                                0 пользователей:
                                Страницы: (78) « Первая ... 45 46 [47] 48 49 ...  77 78


                                Рейтинг@Mail.ru
                                [ Script execution time: 0,0823 ]   [ 16 queries used ]   [ Generated: 20.06.25, 12:58 GMT ]