Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / некоторые маразмы шаблонов и переносимости (просто интересно) / 15 сообщений из 15, страница 1 из 1
13.02.2017, 14:16
    #39403475
Тухлый Толик
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
некоторые маразмы шаблонов и переносимости (просто интересно)
сегодня столкнулся

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
template < class F >
F func(){
  F a = f1(), b = f2();
  F c = min(a, b+1); // компилируется на vs, clang, не компилируется на gcc
  return c;
};

void main(){
  short a = func < short > ();  
};



угадайте почему =)
...
Рейтинг: 0 / 0
13.02.2017, 14:38
    #39403497
ermak.nn
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
некоторые маразмы шаблонов и переносимости (просто интересно)
Тухлый Толиксегодня столкнулся

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
template < class F >
F func(){
  F a = f1(), b = f2();
  F c = min(a, b+1); // компилируется на vs, clang, не компилируется на gcc
  return c;
};

void main(){
  short a = func < short > ();  
};



угадайте почему =)

Что-то непонятно. namespace не указан?
...
Рейтинг: 0 / 0
13.02.2017, 14:44
    #39403500
ermak.nn
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
некоторые маразмы шаблонов и переносимости (просто интересно)
+1 злосчастный. мой clang тоже не хочет компилировать.
...
Рейтинг: 0 / 0
13.02.2017, 15:52
    #39403572
Anatoly Moskovsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
некоторые маразмы шаблонов и переносимости (просто интересно)
Тухлый Толик,

Зачем такой сложный пример.
Вот простой ))
Код: plaintext
1.
2.
    short a, b;
    std::min(a, b+1);



std::min выводит тип аргументов, а это невозможно одновременно с неявным приведением типов. (Точнее возможно, но насколько помню не определено стандартом)
Обойти можно либо явно инстанцируя std::min, либо я вно приведя типы аргументов к одному.
...
Рейтинг: 0 / 0
13.02.2017, 15:58
    #39403580
Anatoly Moskovsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
некоторые маразмы шаблонов и переносимости (просто интересно)
Да, и надеюсь понятно, что short + 1 дает int ))
...
Рейтинг: 0 / 0
13.02.2017, 16:05
    #39403588
CEMb
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
некоторые маразмы шаблонов и переносимости (просто интересно)
Интересно... а если заменить функции числами, то нету падения компилятора.

и вот так, тоже нет:
Код: plaintext
1.
F a = f1(); F b = f2();

Получается, gcc слишком умный? :)
...
Рейтинг: 0 / 0
13.02.2017, 16:09
    #39403593
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
некоторые маразмы шаблонов и переносимости (просто интересно)
CEMbПолучается, gcc слишком умный? :)
ИМХО слишком дотошный.
...
Рейтинг: 0 / 0
13.02.2017, 23:01
    #39403810
alexy_black
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
некоторые маразмы шаблонов и переносимости (просто интересно)
наверное хорошо, что gcc так делает ,это учит кодеров знать и соблюдать стандарт. если компилятор будет позволять очень много, то полуится как с html - написано не правильно, но работет почему-то
...
Рейтинг: 0 / 0
14.02.2017, 00:03
    #39403831
Вася Уткин
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
некоторые маразмы шаблонов и переносимости (просто интересно)
Anatoly MoskovskyТухлый Толик,

Зачем такой сложный пример.
Вот простой ))
Код: plaintext
1.
2.
    short a, b;
    std::min(a, b+1);



std::min выводит тип аргументов, а это невозможно одновременно с неявным приведением типов. (Точнее возможно, но насколько помню не определено стандартом)
Обойти можно либо явно инстанцируя std::min, либо я вно приведя типы аргументов к одному.
Ещё проще пример надо, а то же видно не все тут понимают, что константа 1 по умолчанию int :)
Код: plaintext
1.
std::min((short)1, (int)2);


Просто запрещено сравнивать разные типы, чтобы мягкое с теплым не сравнивали. Кто хочет сравнить - приводит к общему типу через static_cast, который видно за километр, и сам себе злобный буратино если short переполниться раньше, или тем более если кто-то начнет сравнивать unsigned с signed.

http://www.cplusplus.com/doc/tutorial/constants/ 75 // int
75u // unsigned int
75l // long
75ul // unsigned long
75lu // unsigned long

И GCC падает: http://coliru.stacked-crooked.com/a/8c7232d1ffb09d3c
И Clang падает: http://coliru.stacked-crooked.com/a/0205cac221f68fe2


Стандарт приводит код, в котором - оба значения обязаны быть одного типа T обязательно, и ещё 4 уточнения, всё.
http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/n4606.pdf 25.5.7 Minimum and maximum [alg.min.max]
template<class T> constexpr const T& min(const T& a, const T& b);
template<class T, class Compare>
constexpr const T& min(const T& a, const T& b, Compare comp);
1 Requires: For the first form, type T shall be LessThanComparable (Table 19).
2 Returns: The smaller value.
3 Remarks: Returns the first argument when the arguments are equivalent.
4 Complexity: Exactly one comparison.
...
Рейтинг: 0 / 0
14.02.2017, 00:13
    #39403835
Вася Уткин
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
некоторые маразмы шаблонов и переносимости (просто интересно)
MSVS 2013 и MSVS 2015 тоже естественно это Г не компилируют.
...
Рейтинг: 0 / 0
14.02.2017, 08:13
    #39403879
ermak.nn
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
некоторые маразмы шаблонов и переносимости (просто интересно)
Dima TCEMbПолучается, gcc слишком умный? :)
ИМХО слишком дотошный.
На практике, clang находит больше ошибок в коде (причем явных ошибок), чем gcc. Не могу говорить, за все версии, конечно, но та, что стоит на rhel 7.2
...
Рейтинг: 0 / 0
14.02.2017, 11:11
    #39403966
Siemargl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
некоторые маразмы шаблонов и переносимости (просто интересно)
Anatoly MoskovskyДа, и надеюсь понятно, что short + 1 дает int ))Непонятно, точнее неочевидно.
Точнее, когда все время пользуешься неявным выводом типов и привык, а тут надо про это забыть, и начинается е**я "cannot match...2 страницы текста"

И прогресс в это области - неверная подсказка типа "может быть вы имели в виду ....еще 2 страницы текста"
...
Рейтинг: 0 / 0
20.02.2017, 22:46
    #39408155
SashaMercury
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
некоторые маразмы шаблонов и переносимости (просто интересно)
Тухлый Толик,

Передавать аргументы можно любые, проверка типов будет на момент инстанцирования. Поведение вполне очевидное, а какое собственно вы ещё хотели ожидать поведение? Любое другое будет неочевидным.
...
Рейтинг: 0 / 0
20.02.2017, 22:51
    #39408158
SashaMercury
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
некоторые маразмы шаблонов и переносимости (просто интересно)
SiemarglAnatoly MoskovskyДа, и надеюсь понятно, что short + 1 дает int ))Непонятно, точнее неочевидно.
Точнее, когда все время пользуешься неявным выводом типов и привык, а тут надо про это забыть, и начинается е**я "cannot match...2 страницы текста"

И прогресс в это области - неверная подсказка типа "может быть вы имели в виду ....еще 2 страницы текста"

По определению в качестве аргументов будут переданы типы при объявлении. Каждый аргумент имеет свой конкретный тип данных. Можно конечно написать что-то свое, наверное использовать RTTI или еще какие-то механизмы, но это тоже не очевидно
...
Рейтинг: 0 / 0
20.02.2017, 23:52
    #39408173
SashaMercury
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
некоторые маразмы шаблонов и переносимости (просто интересно)
SashaMercuryно это тоже не очевидно
"тоже" - как и любое другое, нежели существующее поведение.
...
Рейтинг: 0 / 0
Форумы / C++ [игнор отключен] [закрыт для гостей] / некоторые маразмы шаблонов и переносимости (просто интересно) / 15 сообщений из 15, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]