Функция, вызываемая без аргументов, не дает ошибки

71
9

Я заметил некоторые проблемы, когда я это заметил. Поскольку функции должны представлять собой группу операторов, которым задано имя, которое может быть вызвано из некоторой точки программы. Рассмотрим простую программу, которая дает абсолютное значение целого числа:

#include <iostream>
#include <vector>
using namespace std;

int getAbsolute(int x) {
return x > 0 ? x : -1*x;
}

int main() {
vector<int> arr;

for(int i = -5; i < 5; i++)
arr.push_back(i);

for(int i = 0; i < arr.size(); i++) {
cout << "abs(" << arr[i] << ") : "
<< getAbsolute << endl;
}
}

Когда я запускаю эту программу:

rohan@~/Dropbox/cprog/demos : $ g++ testFunction.cpp 
rohan@~/Dropbox/cprog/demos : $ ./a.out
abs(-5) : 1
abs(-4) : 1
abs(-3) : 1
abs(-2) : 1
abs(-1) : 1
abs(0) : 1
abs(1) : 1
abs(2) : 1
abs(3) : 1
abs(4) : 1
rohan@~/Dropbox/cprog/demos : $

Мой вопрос: почему эта программа не дает мне ошибку, которую я должен вызывать с помощью аргументов, что-то не так с моим g++ (-v 4.8.5)? И почему эта программа выводит 1 на каждый вызов? Или я что-то пропустил? Я действительно смущен.

спросил(а) 2017-01-07T16:57:00+03:00 3 года, 9 месяцев назад
1
Решение
57

Это утверждение

cout << "abs(" << arr[i] << ") : "
<< getAbsolute << endl;

верно. Обозначение функции getAbsolute неявно преобразуется в указатель функции int (*)( int ) соответствии с объявлением функции

int getAbsolute(int x);

и этот указатель выводится с использованием следующего оператора operator <<

basic_ostream<charT,traits>& operator<<(bool n); 

и вы получите результат, подобный этому

abs(-5) : 1

потому что указатель функции не равен нулю, и этот оператор является лучшим перегруженным оператором operator << для указателя функции такого типа.

ответил(а) 2017-01-07T17:06:00+03:00 3 года, 9 месяцев назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема