powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / некоторые маразмы шаблонов и переносимости (просто интересно)
15 сообщений из 15, страница 1 из 1
некоторые маразмы шаблонов и переносимости (просто интересно)
    #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
некоторые маразмы шаблонов и переносимости (просто интересно)
    #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
некоторые маразмы шаблонов и переносимости (просто интересно)
    #39403500
ermak.nn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
+1 злосчастный. мой clang тоже не хочет компилировать.
...
Рейтинг: 0 / 0
некоторые маразмы шаблонов и переносимости (просто интересно)
    #39403572
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Тухлый Толик,

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



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

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

Получается, gcc слишком умный? :)
...
Рейтинг: 0 / 0
некоторые маразмы шаблонов и переносимости (просто интересно)
    #39403593
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CEMbПолучается, gcc слишком умный? :)
ИМХО слишком дотошный.
...
Рейтинг: 0 / 0
некоторые маразмы шаблонов и переносимости (просто интересно)
    #39403810
alexy_black
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
наверное хорошо, что gcc так делает ,это учит кодеров знать и соблюдать стандарт. если компилятор будет позволять очень много, то полуится как с html - написано не правильно, но работет почему-то
...
Рейтинг: 0 / 0
некоторые маразмы шаблонов и переносимости (просто интересно)
    #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
некоторые маразмы шаблонов и переносимости (просто интересно)
    #39403835
Вася Уткин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
MSVS 2013 и MSVS 2015 тоже естественно это Г не компилируют.
...
Рейтинг: 0 / 0
некоторые маразмы шаблонов и переносимости (просто интересно)
    #39403879
ermak.nn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TCEMbПолучается, gcc слишком умный? :)
ИМХО слишком дотошный.
На практике, clang находит больше ошибок в коде (причем явных ошибок), чем gcc. Не могу говорить, за все версии, конечно, но та, что стоит на rhel 7.2
...
Рейтинг: 0 / 0
некоторые маразмы шаблонов и переносимости (просто интересно)
    #39403966
Siemargl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly MoskovskyДа, и надеюсь понятно, что short + 1 дает int ))Непонятно, точнее неочевидно.
Точнее, когда все время пользуешься неявным выводом типов и привык, а тут надо про это забыть, и начинается е**я "cannot match...2 страницы текста"

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

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

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

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


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