+13
- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
//Сегодня QuestionGovno.
//Допустим есть код:
#include <iostream>
using namespace std;
class T{};
struct M{M(T){}};
struct G{G(T){}};
int f(M){return 0;}
bool f(G){return 0;}
int main() {
bool a(f(T()));
return 0;
}
Казалось бы должна быть неоднозначность при компиляции, так как компилятор не знает какую перегрузку f бы выбрать.
И как бы так оно и есть:
http://ideone.com/o21NDg
Логично? Логично.
Но стандарт считает по другому:
http://en.cppreference.com/w/cpp/language/overload_resolution
Смотрите пункт:
Best viable function
F1 is determined to be a better function than F2 if implicit conversions for all arguments of F1 are not worse than the implicit conversions for all arguments of F2, and
...
2) or. if not that, (only in context of non-class initialization by conversion), the standard conversion sequence from the return type of F1 to the type being initialized is better than the standard conversion sequence from the return type of F2
Как мне повторить поведение, которое указано в стандарте?
Запостил: LispGovno,
22 Ноября 2013
LispGovno 22.11.2013 21:39 # −1
Dummy00001 22.11.2013 21:48 # +1
LispGovno 22.11.2013 21:57 # −1
Суть вот в чем: Написано, что есть случаи, когда перегрузка функции выбирается исходя из наиболее подходящего возвращаемого значения функции (хотя мне кажется что это звучит глупо и я бы такое из стандарта бы выпер). На практике я такого никогда не видел. Вот и стало вдруг интересно как такого добиться? В коде bool не требует конверсии, а int требует прежде чем присваивать булу. Но выбора более подходящей перегрузки функции f по возвращаемому значению функции не произошло.
guest 22.11.2013 22:18 # −9
Но пацаны, как всегда, не обратили внимания на это визгливое кукареканье. Пусть кукарекает, что с него взять?
Петух — не человек, и сегодня ему предстоит очень трудная ночь. У него уже в течение полутора лет каждая ночь была очень трудной, и теперь его анус был разработан настолько, что он без труда мог спрятать в нём банку сгущёнки.
Dummy00001 22.11.2013 22:20 # +1
2. компилеры по таким мелким мелочам тоже нередко глючат. на вывод только одного компилера не полагайся.
guest 22.11.2013 22:21 # −11
Но пацаны, как всегда, не обратили внимания на это визгливое кукареканье. Пусть кукарекает, что с него взять?
Петух — не человек, и сегодня ему предстоит очень трудная ночь. У него уже в течение полутора лет каждая ночь была очень трудной, и теперь его анус был разработан настолько, что он без труда мог спрятать в нём банку сгущёнки.
guest 23.11.2013 21:44 # −1
ForEveR 25.11.2013 10:29 # +2
И в стандарте собственно данный пункт написан как:
the context is an initialization by user-defined conversion (see 8.5, 13.3.1.5, and 13.3.1.6) and the
standard conversion sequence from the return type of F1 to the destination type (i.e., the type of the
entity being initialized) is a better conversion sequence than the standard conversion sequence from
the return type of F2 to the destination type.
LispGovno 26.11.2013 00:31 # 0
defecate-plusplus 26.11.2013 07:51 # 0
он там есть, я вот посмотрел
а жалеть нечего, в любом случае, жизнь - это тлен