Следният код срива компилатора на Microsoft:
class Var
{
public:
template <typename T>
operator T () const
{ }
};
int main()
{
Var v;
switch (v)
{ }
}
Моят въпрос: Правилен ли е кодът или компилаторът трябва да даде подходяща грешка? Възможно ли е недвусмислено преобразуване в интегрален тип?
fatal error C1001: An internal error has occurred in the compiler.
... блабла ... моля, докладвайте на Microsoft (аз докладвах за грешката). На линията на оператора за преобразуване. - person typ1232   schedule 31.07.2014operator T
обаче всъщност не връща нищо, така че това е UB точно там, дори ако е компилиран. - person T.C.   schedule 31.07.2014operator T()
трябва да върне нещо. Второ,switch
чакаint
. - person 101010   schedule 31.07.2014class Var
в изразаswitch
само ако може да се преобразува в интегрална стойност. - person Thomas Matthews   schedule 31.07.2014switch
иска интегрален тип, тип изброяване или тип клас, за който съществува единична неизрична функция за преобразуване в интегрален тип или тип изброяване (6.4.2/2). Ако искаше конкретноint
, можеше да получи такъв сv.operator int()
. Ноv
може да се конвертира във всичко, така че твърдението е двусмислено. - person Igor Tandetnik   schedule 31.07.2014int
е по-кратко :). Извинете за неволното подвеждане. - person 101010   schedule 31.07.2014switch(v)
с червено извиване и изскачащият прозорец Error: изразът трябва да има интегрален или enum тип. - person Rob K   schedule 31.07.2014