Форум программистов, компьютерный форум CyberForum.ru

Имя функции в sizeof - C++

Восстановить пароль Регистрация
 
ViktorKozlov
133 / 125 / 2
Регистрация: 13.12.2012
Сообщений: 293
15.03.2013, 13:53     Имя функции в sizeof #1
Доброго времени суток

Почему, если в sizeof написать имя функции, то компилятор пишет "error C2070: overloaded-function: illegal sizeof operand", даже если она никакая не overloaded и объявлена только один раз?
Например
C++
1
2
3
4
void r(){}
int main(){
    cout<<sizeof(r);    //error C2070: overloaded-function: недопустимый оператор sizeof
}
P.S. Знаю, что в sizeof преобразования к указателю не происходит и поэтому нужно писать &r, но просто любопытно, почему он так пишет, если функция вроде как не перегруженная . Это особенность VS такая или так и должно быть?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
15.03.2013, 13:53     Имя функции в sizeof
Посмотрите здесь:

оператор sizeof C++
sizeof C++
Оператор sizeof C++
sizeof( char * ) & sizeof(char) C++
Вызов функции не используя ее имя С++ C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
15.03.2013, 13:55     Имя функции в sizeof #2
5.3.3/1
The sizeof
operator shall not be applied to an expression that has function or incomplete type, to an enumeration
type whose underlying type is not fixed before all its enumerators have been declared, to the parenthesized
name of such types, or to an lvalue that designates a bit-field. sizeof(char), sizeof(signed char) and
sizeof(unsigned char) are 1.
5.3.3/3
The sizeof operator can be applied to a pointer to a function, but shall not be applied directly to a function.
5.3.3/4
The lvalue-to-rvalue (4.1), array-to-pointer (4.2), and function-to-pointer (4.3) standard conversions are not
applied to the operand of sizeof.
Итого, стандартная конвертация из функции в указатель на функцию для sizeof не работает, потому ошибка

Ах... Ну все равно оставлю пояснение, а почему такое диагностическое сообщение - это уже дело VS, какое сообщение выдавать.
Но судя по доке - эта ошибка как раз для sizeof-а. http://msdn.microsoft.com/en-us/library/9adz64y0.aspx
SummerRain
 Аватар для SummerRain
325 / 324 / 17
Регистрация: 16.12.2012
Сообщений: 544
15.03.2013, 13:56     Имя функции в sizeof #3
как это она не перегруженная, если принимает разные аргументы? (int, char, double)
Tulosba
:)
Эксперт C++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
15.03.2013, 14:00     Имя функции в sizeof #4
Выдержка из стандарта:
The sizeof operator shall not be applied to an expression that has function or incomplete type, to an enumeration type whose underlying type is not fixed before all its enumerators have been declared, to the parenthesized name of such types, or to an lvalue that designates a bit-field.
P.S. Модератор раньше успел

Добавлено через 1 минуту
Цитата Сообщение от SummerRain Посмотреть сообщение
как это она не перегруженная, если принимает разные аргументы? (int, char, double)
Вы о чем сейчас?
Kuzia domovenok
 Аватар для Kuzia domovenok
1882 / 1737 / 116
Регистрация: 25.03.2012
Сообщений: 5,907
Записей в блоге: 1
15.03.2013, 14:01     Имя функции в sizeof #5
Цитата Сообщение от SummerRain Посмотреть сообщение
как это она не перегруженная, если принимает разные аргументы? (int, char, double)
Так sizeof это и не функция, а (int, char, double) - не аргументы
Tulosba
:)
Эксперт C++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
15.03.2013, 14:09     Имя функции в sizeof #6
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
Так sizeof это и не функция, а (int, char, double) - не аргументы
С первым согласен - не функция, а оператор. Но вот int, char, double и прочее это как раз аргументы (ну или в оригинале operand).
Kuzia domovenok
 Аватар для Kuzia domovenok
1882 / 1737 / 116
Регистрация: 25.03.2012
Сообщений: 5,907
Записей в блоге: 1
15.03.2013, 14:13     Имя функции в sizeof #7
Цитата Сообщение от Tulosba Посмотреть сообщение
аргументы (ну или в оригинале operand).
Это ты каким англо-русским словарём сейчас пользуешься, чтобы утверждать такое?
Tulosba
:)
Эксперт C++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
15.03.2013, 14:28     Имя функции в sizeof #8
Kuzia domovenok, ну может быть ты мне тогда скажешь в чем отличие "аргумента" от "операнда" ?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.03.2013, 17:43     Имя функции в sizeof
Еще ссылки по теме:

C++ Operator sizeof
sizeof() C++
C++ Имя соглашения о вызове функции

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
ViktorKozlov
133 / 125 / 2
Регистрация: 13.12.2012
Сообщений: 293
15.03.2013, 17:43  [ТС]     Имя функции в sizeof #9
Цитата Сообщение от ForEveR Посмотреть сообщение
эта ошибка как раз для sizeof-а. http://msdn.microsoft.com/en-us/library/9adz64y0.aspx
Ну да, перед двоеточием там ставится как раз тот тип, который не может принять sizeof. И если написать sizeof(*r), то в ошибке пишет уже непосредственно сам тип функции void (void), так как при разыменовании имя функции приводится к указателю и разыменовывается, т.е. вроде как тот же результат должен получиться. Только вот что за тип такой получается, "overloaded-function", если поставить просто имя, не совсем понятно
Yandex
Объявления
15.03.2013, 17:43     Имя функции в sizeof
Ответ Создать тему
Опции темы

Текущее время: 15:32. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru