2013-10-10 8 views
0

Рассмотрим следующую программу:разница между + Ь и оператор + (а, б)

#include<functional> 

typedef std::function< int(int) > F; 

F operator+(F, F) 
{ 
    return F(); 
} 

int f(int x) { return x; } 

int main() 
{ 
    operator+(f,f); // ok 
    f+f; // error: invalid operands to binary expression 
} 

Почему последняя строка f+f; не компилировать? Почему это не идентично operator+(f,f);? Будет оценена ссылка на стандарт.

+1

Возможный дубликат http://stackoverflow.com/questions/13869150/rules-for-lookup-of-operators-in-c11? – Cubbi

+0

@Cubbi Я не думаю, что это дубликат, это о * перегруженных * членах и операциях блокировки области. –

+0

хорошо, что ответ поднял правила поиска (которые отличаются друг от друга для 'a + b' vs.' operator + (a, b) '), поэтому он ответил бы на заголовок вашего вопроса .. но да, в этом случае, в стандарте есть ярлык. – Cubbi

ответ

2

Тип f - это встроенный тип. Операции над объектами встроенных типов никогда не учитывают операторы определения пользователя. Вызов operator+(f, f) явно принудительно приводит к двум преобразованиям, которые не произойдут, если они не будут принудительно. Соответствующая оговорка 13.3.1.2 [over.match.oper] пункт 1:

Если ни один из операндов оператора в выражении не имеют типа, который является классом или перечисление, оператор предполагается быть встроенный оператор и интерпретируется в соответствии с пунктом 5. ...

+0

Спасибо! Я думаю, это также объясняет * почему *: Совместимость с C. Правильное выражение из C, похожее на 'f + f', должно давать тот же результат. Что-то вроде 'operator + (f, f)' не существует в C, поэтому вполне нормально рассматривать его как вызов функции C++. Верный? –

Смежные вопросы