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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
ViktorKozlov
133 / 125 / 2
Регистрация: 13.12.2012
Сообщений: 293
#1

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

15.03.2013, 13:53. Просмотров 524. Ответов 8
Метки нет (Все метки)

Доброго времени суток

Почему, если в 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 такая или так и должно быть?
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
15.03.2013, 13:53
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Имя функции в sizeof (C++):

Sizeof(.) или constexpr size_t tmp = sizeof(.) - C++
sizeof(...) или constexpr size_t tmp = sizeof(...) Как лучше с точки зрения производительности? правильности?

Fwrite (buffer , sizeof(char), sizeof(buffer), pFile) - C++
как записать часть массива чаров? допустим у нас arr; мне надо записать с позиции массива 500 до 600, 100 байтов как записать эту...

Программа, которая выводит на экран значение функции sizeof от типов short, int, long и тд - C++
Кого не затруднит, создайте новый проект. Определите размерность базовых типов в вашей системе. Для этого напишите программу, которая...

sizeof( char * ) & sizeof(char) - C++
Здравствуйте, не могу понять почему sizeof(char *) = 4 а sizeof(char) = 1. Ну с последним ясно , а вот с первым непойму... Может кто-то...

Вызов функции не используя ее имя - C++
Собственно, сабж. Задачку вот подкинули: нужно вызвать функцию так, что-бы ее имя нигде не упоминалось. То есть, пишем класс, там нашу...

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

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
ForEveR
В астрале
Эксперт С++
7972 / 4734 / 321
Регистрация: 24.06.2010
Сообщений: 10,542
Завершенные тесты: 3
15.03.2013, 13:55 #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
2
SummerRain
326 / 325 / 17
Регистрация: 16.12.2012
Сообщений: 544
15.03.2013, 13:56 #3
как это она не перегруженная, если принимает разные аргументы? (int, char, double)
1
Tulosba
:)
Эксперт С++
4396 / 3239 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
15.03.2013, 14:00 #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)
Вы о чем сейчас?
1
Kuzia domovenok
1891 / 1746 / 118
Регистрация: 25.03.2012
Сообщений: 5,925
Записей в блоге: 1
15.03.2013, 14:01 #5
Цитата Сообщение от SummerRain Посмотреть сообщение
как это она не перегруженная, если принимает разные аргументы? (int, char, double)
Так sizeof это и не функция, а (int, char, double) - не аргументы
1
Tulosba
:)
Эксперт С++
4396 / 3239 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
15.03.2013, 14:09 #6
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
Так sizeof это и не функция, а (int, char, double) - не аргументы
С первым согласен - не функция, а оператор. Но вот int, char, double и прочее это как раз аргументы (ну или в оригинале operand).
1
Kuzia domovenok
1891 / 1746 / 118
Регистрация: 25.03.2012
Сообщений: 5,925
Записей в блоге: 1
15.03.2013, 14:13 #7
Цитата Сообщение от Tulosba Посмотреть сообщение
аргументы (ну или в оригинале operand).
Это ты каким англо-русским словарём сейчас пользуешься, чтобы утверждать такое?
0
Tulosba
:)
Эксперт С++
4396 / 3239 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
15.03.2013, 14:28 #8
Kuzia domovenok, ну может быть ты мне тогда скажешь в чем отличие "аргумента" от "операнда" ?
0
ViktorKozlov
133 / 125 / 2
Регистрация: 13.12.2012
Сообщений: 293
15.03.2013, 17:43  [ТС] #9
Цитата Сообщение от ForEveR Посмотреть сообщение
эта ошибка как раз для sizeof-а. http://msdn.microsoft.com/en-us/library/9adz64y0.aspx
Ну да, перед двоеточием там ставится как раз тот тип, который не может принять sizeof. И если написать sizeof(*r), то в ошибке пишет уже непосредственно сам тип функции void (void), так как при разыменовании имя функции приводится к указателю и разыменовывается, т.е. вроде как тот же результат должен получиться. Только вот что за тип такой получается, "overloaded-function", если поставить просто имя, не совсем понятно
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.03.2013, 17:43
Привет! Вот еще темы с ответами:

Sizeof - C++
int a = { 1, 2, 3, 4 },n = sizeof(a) / sizeof(a); Битый час разбираюсь с этой строкой,но понять не могу. Мы делим массив &quot;a&quot; на...

sizeof - C++
Подскажите пожалуйста что делаю не так? в базовом классе gameElement, имеется матрица указателей на базовый класс: gameElement* arr; ...

sizeof() - C++
Ребята,объясните пожалуйста для чего нужен sizeof()?А то в книге очень заумно написано...

Имя файла как параметр функции - C++
Необходимо заполнить массив из файла, для этого нужно создать отдельную функцию параметром которой будет являться имя файла. Хотелось бы...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
15.03.2013, 17:43
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru