Czy istnieją reguły dotyczące niejawnej konwersji typów dla argumentów operatora trójskładnikowego?C++: Ternary Operator (operator warunkowy) i jego zasady konwersji niejawnych typów
Operator trójki musi zawsze zwracać ten sam typ. Ten typ jest określany wyłącznie przez drugi i trzeci argument (1st ? 2nd : 3rd
), dlatego oba argumenty są konwertowane na ten typ. W jaki sposób określa się ten typ?
A dokładniej, to badane przykład:
class pointclass
{
pointclass();
pointclass(int i); // (pointclass)(int)
operator bool() const; // (bool)(pointclass)
};
mam klasy (pointclass
), która umożliwia konwersję niejawny z int
do pointclass
i ukryta konwersji z pointclass
do bool
.
int i;
pointclass p;
bool b;
b ? p : i; // (bool) ? (int)(bool)(pointclass) : (int)
b ? i : p; // (bool) ? (int) : (int)(bool)(pointclass)
pomocą operatora potrójny, porównuję pointclass
i int
. Kompilator używa niejawnej konwersji z pointclass
do bool
, a następnie standardowej konwersji z bool
na int
. Odbywa się to bez względu na to, czy wymieniam 2. i 3. argumenty. Dlaczego to nie konwertuje int
na pointclass
?
Stosując operator porównania jest znacznie bardziej prosta:
p == i; // (pointclass) == (pointclass)(int)
i == p; // (int) == (int)(bool)(pointclass)
rodzaju argumentów jest po prostu określona przez pierwszy argument.
Ale nie rozumiem reguł konwersji typu operatora trójskładnikowego. Wydaje mi się, że używasz sposobu większości konwersji.
Tak, reguły są w [expr.cond] w standardzie. – chris
Ktoś bardziej zorientowany w sposób standardowy niż ja może udzielić autorytatywnej odpowiedzi, ale z reguły zamieniają się one na "najbliższy" wspólny typ, na który mogą być konwertowane. – SergeyA
Jeśli myślisz, że C++ robi fajne rzeczy, oszczędzaj myśli dla biednych gości z Java. – Bathsheba