
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[216.73.216.21] |
![]() |
|
Страницы: (78) « Первая ... 45 46 [47] 48 49 ... 77 78 ( Перейти к последнему сообщению ) |
Сообщ.
#691
,
|
|
|
Да, судя по всему так... Спасибо.
Печально. |
![]() |
Сообщ.
#692
,
|
|
И то верно. А какой тип должен быть выведен для x? std::initializer_list<int>[2] или int[3][2]?
|
Сообщ.
#693
,
|
|
|
Цитата Qraizer @ А какой тип должен быть выведен для x? std::initializer_list<int>[2] или int[3][2]? Почему тебя не смущает, что для ![]() ![]() auto x = { 1, 2, 3 }; Он выводит не массив, а std::initializer_list<int>? И почему в случае вложенности он не может сделать тоже самое? |
![]() |
Сообщ.
#694
,
|
|
Там ещё пример есть:
![]() ![]() template<class T> void g(T); g({1,2,3}); // error: no argument deduced for T |
Сообщ.
#695
,
|
|
|
Ну и да:
![]() ![]() auto x = {1, 2, 3}; auto y = {1, 2, 3}; auto z = {x, y}; // ok ![]() ![]() auto z = { {1, 2, 3}, {1, 2, 3} }; // не осилил ![]() |
![]() |
Сообщ.
#696
,
|
|
Цитата D_KEY @ Потому что для этих случаев есть отдельные пункты, а для остальных "the deduced type determined using the rules of template argument deduction from a function call" Он выводит не массив, а std::initializer_list<int>? Добавлено Думаю, тут дело в неоднозначности намерений программиста. В случае простого auto = {...} всё просто - это braced-init-list, а в случае f({...}} будьте добры явно указать в прототипе f(), что хотите там видеть std::initializer_list<int>. |
Сообщ.
#697
,
|
|
|
Цитата Qraizer @ Думаю, тут дело в неоднозначности намерений программиста. В случае простого auto = {...} всё просто - это braced-init-list, а в случае f({...}} будьте добры явно указать в прототипе f(), что хотите там видеть std::initializer_list<int>. Это понятно. Но у меня то просто auto = {...}. Просто каждый элемент тоже {...}. В общем, не нравится мне это решение с плохо связанными между собой auto, decltype и выводом типа шаблона - кто в лес, кто по дрова... Но ладно, будем знать. |
![]() |
Сообщ.
#698
,
|
|
Ну так auto как раз подразумевает вывод типа компилятором. А у него неоднозначность. Попробуй попользовать typeid().name() или decltype со списком инициализации. Другое дело, если ты явно говоришь int = {}, как и в случае параметров функций (initializer_list<int>) или (int[]). Но ведь auto ж.
|
Сообщ.
#699
,
|
|
|
Мне, в первую очередь, не нравится тот пример, что я описал в #695 посте.
Очень странно ведет себя "вывод типов", особенно по сравнению с развитыми системами типизации, где вывод типов был всегда... Впрочем, это уже совсем другая тема ![]() |
![]() |
Сообщ.
#700
,
|
|
Там типы x и y уже выведены по правилам braced-init-list для агрегатных объектов, так что для z уже всё известно. Во втором же случае непонятно даже, можно ли рассматривать вложенные {} как агрегатные.
|
Сообщ.
#701
,
|
|
|
Цитата Qraizer @ Там типы x и y уже выведены по правилам braced-init-list для агрегатных объектов, так что для z уже всё известно. Во втором же случае непонятно даже, можно ли рассматривать вложенные {} как агрегатные. Это понятно. Не понятно, зачем так было проектировать языковый фичи. У меня такое чувство, что ты меня провоцируешь на оффтоп ![]() |
![]() |
Сообщ.
#702
,
|
|
Ну... вот аналогия.
![]() ![]() template <typename T> class complex_number { public: complex_number(T); /* ... */ }; template <typename T> class array { public: explicit array(std::size_t); /* ... */ }; Вот чтобы таких косяков со списками инициализаций не было, потому и не однозначность. |
Сообщ.
#703
,
|
|
|
Qraizer, мне не понятно, почему auto не может применять свои правила рекурсивно в данном случае.
|
![]() |
Сообщ.
#704
,
|
|
![]() ![]() int x[][] = { {1, 2, 3}, {4, 5, 6} }; Добавлено Уже не знаю, как ещё понятнее рассказать о неоднозначности намерений программиста, имеющей место в данном случае. |
Сообщ.
#705
,
|
|
|
Цитата Qraizer @ Уже не знаю, как ещё понятнее рассказать о неоднозначности намерений программиста, имеющей место в данном случае. ![]() ![]() 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 @ ![]() ![]() int x[][] = { {1, 2, 3}, {4, 5, 6} }; Это к чему? ![]() ![]() int x[] = {1, 2, 3, 4, 5, 6}; |