2015-10-22 3 views
0

Чтение действительно длинных функций может быть очень забавным!Что делает оператор <- делать в C++?

int crazylongfun() 
{ 
    int x = -1; 
    foo b = -42; 

//... 1000 lines below 

    if(b<-x) 
    { 
    std::printf("How did I get here there is no left arrow operator?\n"); 
    } 

    return 0;  
} 

Глядя на определение Foo

struct foo 
{ 
    int x; 

    foo(int a) : x(a) {} 

    operator int() const 
    { 
    return x; 
    } 
}; 

Это компилируется нормально и производит желаемый результат. Каков механизм, который позволяет это?

+2

смотрите также «головастика оператора ": http://blogs.msdn.com/b/oldnewthing/archive/2015/05/25/10616865.aspx –

ответ

3

Возможные неявные операторы преобразования в C++ являются спорными, например. Are implicit conversions good or bad in modern C++?. Когда они определены, может быть очень интересная синтаксическая ситуация для не знающего программиста. Вышеприведенное является лишь примером.

Вот как это работает:

Struct Foo имеет оператор преобразования определен и, следовательно, конвертируемые в целое, которое заставляет его быть неявно преобразован и по сравнению с локальной переменной х меньше, чем минус х.

код на самом деле:

if(int(b)<(-x)) 

т.е. Там нет левого оператора стрелка < - в C++.

5

Это просто «меньше отрицательного X».

if (b < -x) 

После 1000 строк я бы тоже скрестил глаза!

3

Что делает оператор <- делать в C++?

На самом деле это не оператор (в отличие от ->, который является одним).

Как уже упоминалось в других ответах, есть на самом деле два оператора функции применяются:

  1. Унарное operator-() применяя отрицательный знак значения
  2. Меньше сравнения operator<()
Смежные вопросы