2015-03-02 2 views
1

Я пытаюсь показать продвижение аргументов по умолчанию в функциях. В частности, я хочу проверить раздел 6.5.2.2. Функциональные вызовы (описано here).Продвижение аргументов по умолчанию в функциях

Я хочу иметь вызов функции без прототипа, чтобы увидеть продвижение аргументов по умолчанию до целого числа, но я получаю ошибку «Функция не принимает 1 аргумент». Это то, что я пытаюсь сделать:

#include<iostream> 
using namespace std; 

//void Func(char val); 
//void Func(int val); 
void Func(); // No prototype 

int main(int argc, char** argv) 
{ 
    char charVal = 'a'; 
    cout << "Func(charVal) - "; Func(charVal); 

    return 0; 
} 

void Func(char val) 
{ 
    cout << "Char arg. Result: " << val << endl; 
} 

void Func(int val) 
{ 
    cout << "Int arg. Result: " << val << endl; 
} 

Ожидается, что Func (int) будет вызван из-за продвижения аргументов. Это уже снято со стандарта?

Cheers.

P.S- Я только что видел, что подобные объявления с прототипом не являются частью стандарта C, а не C++. Любая конкретная причина, по которой C++ не поддерживает его?

+4

Только перегрузка 'Func()' находится в области - то, которое принимает нулевые аргументы. Продвижение не имеет к этому никакого отношения. Если другие перегрузки были в области видимости, будет выбрана перегрузка 'Func (char). – 0x499602D2

ответ

4

Все функции (и названные объекты в целом) должны быть объявлены перед использованием. Вы только объявили перегрузку без каких-либо параметров (что является пустым списком параметров в C++), когда вы пытаетесь вызвать его с аргументом в main.

У вас есть правильные объявления в начале файла, но по какой-то причине вам нужно прокомментировать. Раскройте их, и все в порядке.

Я только что увидел, что подобные объявления с прототипом не являются частью стандарта C, а не C++. Любая конкретная причина, по которой C++ не поддерживает его?

Поскольку C++ поддерживает перегрузку. Разрешение перегрузки происходит во время компиляции, где вызывается функция, и кандидаты могут рассматриваться только в том случае, если компилятор знает, что они существуют, то есть, если они были полностью объявлены, чтобы компилятор мог сопоставить свои подписи против типов аргументов вызов функции.

В C компилятор знает, какую функцию вы имеете в виду, независимо от того, знает ли он типы параметров, поскольку он является единственным с этим именем. Такие объявления просто опасны, удаляя проверку типов из типов аргументов и открывая дверь для всех ошибок.

2

C++ никогда не поддерживал декларации функций прототипа. Пустой список аргументов в C++ означает отсутствие аргументов, а не отсутствие прототипа.

Причина в том, что C++ имеет тип-безопасное соединение, и это просто не работает, если у вас нет прототипа. И C++ имеет тип-безопасное соединение, потому что это просто хорошая идея и уменьшает количество ошибок. (Вы можете прочитать Design & Эволюция C++ для более подробной информации.)

АРГУМЕНТ акции в C++ существуют только в вызовах истинных функций переменным числом, то есть тех, которые объявлены с ... в списке аргументов.

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