- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
template < typename T >
T shit (void)
{
return 0;
}
int main()
{
int crap = shit();
// Почему дедукция аргумента шаблона в данном случае не работает?
return crap;
}
//-------------------------------------
int shit (void)
{
return 0;
}
// Почему functions that differ only in their return type cannot be overloaded
double shit (void)
{
return 0;
}
int main()
{
int crap = shit();
return crap;
}
1024-- 22.01.2018 11:24 # +2
https://ideone.com/yDMHGY
Теперь я даже не знаю, спорить ли мне с автором или присоединяться.
Antervis 22.01.2018 11:38 # +3
Можно делать возврат прокси, кастующегося во всё что требуется. Но перегрузку по вышеописанной причине не оформишь.
1024-- 22.01.2018 12:03 # 0
Но в обратном случае же что-то выводится в итоге https://ideone.com/SNaVKW
И даже если в частном случае навесить типы, которые друг в друга совсем не кастуются или вызывают неоднозначность, перегрузка будет работать для некоторого набора других случаев.
С другой стороны, с аргументом "и чего мы тут ждём?" можно много чего запретить.
Elvenfighter 22.01.2018 12:54 # 0
COTOHuHCKuu_nemyx 23.03.2019 16:11 # 0
j123123 22.01.2018 12:34 # +2
Первый каст определит то, какую из функций надо вызывать, второй уже приведет возвращаемое к нужному типу
Antervis 22.01.2018 13:50 # +2
1. Type var = foo(); вместо auto var = foo<Type>();
2. bar(Type t); bar(foo()); вместо bar(foo<Type>());
Так ли это принципиально? Если да, то твои предложения в плане синтаксиса?
subaru 23.01.2018 00:14 # 0
j123123 24.01.2018 16:21 # 0
На самом деле ничего не принципиально, можно голой сишкой без всяких плюсов обходиться, накостыливая свои кодогенераторы в случае необходимости
> Если да, то твои предложения в плане синтаксиса?
Синтаксиса для чего? Чтоб два раза подряд что-то кастануть, никакого нового синтаксиса не нужно
AnalPerOral 26.01.2018 14:32 # 0
AnalPerOral 26.01.2018 20:10 # 0
g0_1494089156986 29.01.2018 11:58 # 0
g0cTb 22.01.2018 13:08 # +4
roman-kashitsyn 22.01.2018 13:18 # +2
g0cTb 22.01.2018 13:22 # 0
Они умеют выводить параметры женериков из того, как используется возвращаемое значение.
Вот еще пример:
Desktop 22.01.2018 13:29 # −1
roman-kashitsyn 22.01.2018 13:36 # 0
Desktop 22.01.2018 13:38 # 0
Кстати, оказалось, что вывод типа при помощи переменной, в которую сохраняется значение, есть, например, в Свифте:
subaru 22.01.2018 13:54 # −1
И че?
roman-kashitsyn 22.01.2018 13:54 # 0
Ну тут понятно, что неоднозначность, из контекста непонятно, что должно быть. Тут тебе даже хаскель тип не выведет.
Desktop 22.01.2018 14:19 # 0
Кстати, с таким подходом можно сделать функции, результат которых нужно обязательно использовать (как минимум, сохранить в переменную).
bormand 23.01.2018 07:44 # 0
Странная логика. Вроде ждут число, а сообщение наоборот.
subaru 23.01.2018 11:14 # 0
bormand 23.01.2018 16:48 # +2
subaru 23.01.2018 17:41 # +2
CaptainPlastid 23.02.2018 22:57 # 0
Antervis 24.01.2018 09:55 # 0
Например, так.
CaptainPlastid 23.02.2018 22:59 # 0
CocaColaGovno 31.12.2021 17:32 # 0
roman-kashitsyn 22.01.2018 12:50 # +5
Elvenfighter 22.01.2018 19:54 # +1
roman-kashitsyn 23.01.2018 11:43 # +2
A function template can only be fully specialized
Говорю же, жизнь слишком коротка, чтобы разбираться потом в этом говне.
j123123 23.03.2019 15:18 # +2
Плюсы слишком говно, чтобы разбираться в этих говноособенностях
j123123 31.12.2021 08:59 # +1
JloJle4Ka 31.12.2021 09:00 # 0
COTOHuHCKuu_nemyx 23.03.2019 20:32 # 0
nemyx_Ha_naJlo4Ke 24.03.2019 01:04 # 0
CocaColaGovno 31.12.2021 17:31 # 0
roman-kashitsyn 23.01.2018 11:55 # +1
Dummy00001 23.01.2018 14:12 # 0
> auto y = zero<float>();
извиняюсь, но это идиотизм. если ты уже вынуждень писать имя типа всегда, то тогда еще проще сделать:
> auto x = zero_int();
> auto y = zero_float();
бонус: на букву короче, и определений в раза два меньше. красота среди бегущих.
life is too short, to make it complicated. KISS.
roman-kashitsyn 23.01.2018 14:21 # +2
Демонстрационный игрушечный пример же. Если тип — параметр шаблона, то не проще.
Dummy00001 23.01.2018 14:44 # +1
Psionic 22.01.2018 14:23 # −1
Dummy00001 23.01.2018 12:46 # 0
тип возврата не включен в манглд имя функции/метода. поэтому линкер их отличить не сможет.
не знаю почему именно было сделано.
может быть для того что бы разрешить ап-каст типа возврата, типа "class A; class B : class A; A* getA(); B* getA() { static B b; return &b; }". или наоборот: потому что наследование классов вводит неодназначносить имени типа/класса.
roman-kashitsyn 23.01.2018 13:31 # 0
Если функция не шаблонная.
Whether the mangling of a function type includes the return type depends on the context and the nature of the function. The rules for deciding whether the return type is included are:
* Template functions (names or types) have return types encoded, with the exceptions listed below.
* Function types not appearing as part of a function name mangling, e.g. parameters, pointer types, etc., have return type encoded, with the exceptions listed below.
* Non-template function names do not have return types encoded.
-- https://itanium-cxx-abi.github.io/cxx-abi/abi.html#mangle.function-type
> может быть для того что бы разрешить ап-каст типа возврата
Сомневаюсь, таблице виртуальных функций наплевать на манглинг.
Dummy00001 23.01.2018 14:03 # 0
> Сомневаюсь, таблице виртуальных функций наплевать на манглинг.
полиморфизм тут ни причем. это обычное наследование.
это та же самая байда что и type promotion, в принципе. только с той разницей что пользовательские типы.
> > тип возврата не включен в манглд имя функции/метода
> Если функция не шаблонная.
был не в курсе.
мне лично уже бы хватило различия void/не-void функция. не универсально - но часто достаточно. (в любом случае .) стандарту бы тоже помогло: например pop_front() стлный мог бы тогда возвращать/не возвращать значение в зависимости от контекста.
я в прошлом эксперементировал с void контекстами: пытался в выражении `obj;` заставить вызывать каст оператор `operator void ()`. деталей уже не помню - давно трахался с этим - но помню что очень криво работало. сейчас попробовал - вообще ни фига не работает. гугл говорит что все правильно - и не должно было никогда работать.
roman-kashitsyn 23.01.2018 14:11 # 0
Тогда это просто разные функции, B::getA() скрывает (а не переопределяет) A::getA(). Имя класса используется в манглинге. Без переопределения можно хоть void B::getA() написать.
Dummy00001 23.01.2018 14:23 # 0
декларация: A* getA().
определение: B* getA().
это в крестах не работает - но теоретически могло бы.
roman-kashitsyn 23.01.2018 14:28 # 0
Ок, тогда непонятно, к чему ты всё это писал.
Dummy00001 23.01.2018 14:36 # +1
то чем я в прошлом конкретно страдал - уже давно сам забыл. но было тоже в тему различия по типу возврата.
ASD_77 01.01.2022 01:12 # 0
а теперь похер что там подходит
ISO 01.01.2022 01:41 # 0
Здесь нет diamond'а; виртуальное наследование к проблеме, о которой говорил Dummy00001, не относится никак.
Soul_re@ver 01.01.2022 06:52 # +3
guest6 01.01.2022 15:17 # 0
ASD предлагает сделать
таким образом парент станет один, и всё заработает.
А Дамми о чем говорит? Причем тут вообще перегрузка по возвращаемому значению, которой в крестах нет?
CocaColaGovno 01.01.2022 15:25 # +1
Он сгнил.
TPOJlJlb 01.01.2022 01:08 # 0
Весь серьезный софт, виданый мной, был писан на Borland Delphi 7. Под серьезным подразумевается софт, которым пользуется высшее руководство и который установлен на ПК в ФСБ, Роспотреб-, Росприрод-, Ростех- — и ещё с охулион разных "надзоров" и в Минздраве.
ASD_77 01.01.2022 01:11 # 0
guest6 01.01.2022 01:14 # −4
TPOJlJlb 01.01.2022 01:19 # 0
Может, ты подпёздываешь?