- 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;
}
https://ideone.com/yDMHGY
Теперь я даже не знаю, спорить ли мне с автором или присоединяться.
Можно делать возврат прокси, кастующегося во всё что требуется. Но перегрузку по вышеописанной причине не оформишь.
Но в обратном случае же что-то выводится в итоге https://ideone.com/SNaVKW
И даже если в частном случае навесить типы, которые друг в друга совсем не кастуются или вызывают неоднозначность, перегрузка будет работать для некоторого набора других случаев.
С другой стороны, с аргументом "и чего мы тут ждём?" можно много чего запретить.
Первый каст определит то, какую из функций надо вызывать, второй уже приведет возвращаемое к нужному типу
1. Type var = foo(); вместо auto var = foo<Type>();
2. bar(Type t); bar(foo()); вместо bar(foo<Type>());
Так ли это принципиально? Если да, то твои предложения в плане синтаксиса?
На самом деле ничего не принципиально, можно голой сишкой без всяких плюсов обходиться, накостыливая свои кодогенераторы в случае необходимости
> Если да, то твои предложения в плане синтаксиса?
Синтаксиса для чего? Чтоб два раза подряд что-то кастануть, никакого нового синтаксиса не нужно
Они умеют выводить параметры женериков из того, как используется возвращаемое значение.
Вот еще пример:
Кстати, оказалось, что вывод типа при помощи переменной, в которую сохраняется значение, есть, например, в Свифте:
И че?
Ну тут понятно, что неоднозначность, из контекста непонятно, что должно быть. Тут тебе даже хаскель тип не выведет.
Кстати, с таким подходом можно сделать функции, результат которых нужно обязательно использовать (как минимум, сохранить в переменную).
Странная логика. Вроде ждут число, а сообщение наоборот.
Например, так.
A function template can only be fully specialized
Говорю же, жизнь слишком коротка, чтобы разбираться потом в этом говне.
Плюсы слишком говно, чтобы разбираться в этих говноособенностях
> auto y = zero<float>();
извиняюсь, но это идиотизм. если ты уже вынуждень писать имя типа всегда, то тогда еще проще сделать:
> auto x = zero_int();
> auto y = zero_float();
бонус: на букву короче, и определений в раза два меньше. красота среди бегущих.
life is too short, to make it complicated. KISS.
Демонстрационный игрушечный пример же. Если тип — параметр шаблона, то не проще.
тип возврата не включен в манглд имя функции/метода. поэтому линкер их отличить не сможет.
не знаю почему именно было сделано.
может быть для того что бы разрешить ап-каст типа возврата, типа "class A; class B : class A; A* getA(); B* getA() { static B b; return &b; }". или наоборот: потому что наследование классов вводит неодназначносить имени типа/класса.
Если функция не шаблонная.
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
> может быть для того что бы разрешить ап-каст типа возврата
Сомневаюсь, таблице виртуальных функций наплевать на манглинг.
> Сомневаюсь, таблице виртуальных функций наплевать на манглинг.
полиморфизм тут ни причем. это обычное наследование.
это та же самая байда что и type promotion, в принципе. только с той разницей что пользовательские типы.
> > тип возврата не включен в манглд имя функции/метода
> Если функция не шаблонная.
был не в курсе.
мне лично уже бы хватило различия void/не-void функция. не универсально - но часто достаточно. (в любом случае .) стандарту бы тоже помогло: например pop_front() стлный мог бы тогда возвращать/не возвращать значение в зависимости от контекста.
я в прошлом эксперементировал с void контекстами: пытался в выражении `obj;` заставить вызывать каст оператор `operator void ()`. деталей уже не помню - давно трахался с этим - но помню что очень криво работало. сейчас попробовал - вообще ни фига не работает. гугл говорит что все правильно - и не должно было никогда работать.
Тогда это просто разные функции, B::getA() скрывает (а не переопределяет) A::getA(). Имя класса используется в манглинге. Без переопределения можно хоть void B::getA() написать.
декларация: A* getA().
определение: B* getA().
это в крестах не работает - но теоретически могло бы.
Ок, тогда непонятно, к чему ты всё это писал.
то чем я в прошлом конкретно страдал - уже давно сам забыл. но было тоже в тему различия по типу возврата.
а теперь похер что там подходит
Здесь нет diamond'а; виртуальное наследование к проблеме, о которой говорил Dummy00001, не относится никак.
ASD предлагает сделать
таким образом парент станет один, и всё заработает.
А Дамми о чем говорит? Причем тут вообще перегрузка по возвращаемому значению, которой в крестах нет?
Он сгнил.
Весь серьезный софт, виданый мной, был писан на Borland Delphi 7. Под серьезным подразумевается софт, которым пользуется высшее руководство и который установлен на ПК в ФСБ, Роспотреб-, Росприрод-, Ростех- — и ещё с охулион разных "надзоров" и в Минздраве.
Может, ты подпёздываешь?