137 / 129 / 59
Регистрация: 13.12.2012
Сообщений: 293
1

Имя функции в sizeof

15.03.2013, 13:53. Показов 1866. Ответов 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
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
15.03.2013, 13:53
Ответы с готовыми решениями:

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

Fwrite (buffer , sizeof(char), sizeof(buffer), pFile)
как записать часть массива чаров? допустим у нас arr; мне надо записать с позиции массива 500 до...

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

Является ли оператор sizeof синтаксическим сахаром над System.Runtime.InteropServices.Marshal.SizeOf?
Является ли оператор sizeof синтаксическим сахаром над...

8
В астрале
Эксперт С++
8042 / 4799 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
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-u... z64y0.aspx
2
328 / 327 / 92
Регистрация: 16.12.2012
Сообщений: 544
15.03.2013, 13:56 3
как это она не перегруженная, если принимает разные аргументы? (int, char, double)
1
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
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
3658 / 2995 / 828
Регистрация: 25.03.2012
Сообщений: 11,036
Записей в блоге: 1
15.03.2013, 14:01 5
Цитата Сообщение от SummerRain Посмотреть сообщение
как это она не перегруженная, если принимает разные аргументы? (int, char, double)
Так sizeof это и не функция, а (int, char, double) - не аргументы
1
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
15.03.2013, 14:09 6
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
Так sizeof это и не функция, а (int, char, double) - не аргументы
С первым согласен - не функция, а оператор. Но вот int, char, double и прочее это как раз аргументы (ну или в оригинале operand).
1
3658 / 2995 / 828
Регистрация: 25.03.2012
Сообщений: 11,036
Записей в блоге: 1
15.03.2013, 14:13 7
Цитата Сообщение от Tulosba Посмотреть сообщение
аргументы (ну или в оригинале operand).
Это ты каким англо-русским словарём сейчас пользуешься, чтобы утверждать такое?
0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
15.03.2013, 14:28 8
Kuzia domovenok, ну может быть ты мне тогда скажешь в чем отличие "аргумента" от "операнда" ?
0
137 / 129 / 59
Регистрация: 13.12.2012
Сообщений: 293
15.03.2013, 17:43  [ТС] 9
Цитата Сообщение от ForEveR Посмотреть сообщение
эта ошибка как раз для sizeof-а. http://msdn.microsoft.com/en-u... z64y0.aspx
Ну да, перед двоеточием там ставится как раз тот тип, который не может принять sizeof. И если написать sizeof(*r), то в ошибке пишет уже непосредственно сам тип функции void (void), так как при разыменовании имя функции приводится к указателю и разыменовывается, т.е. вроде как тот же результат должен получиться. Только вот что за тип такой получается, "overloaded-function", если поставить просто имя, не совсем понятно
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
15.03.2013, 17:43
Помогаю со студенческими работами здесь

Sizeof() не работает в функции
Хочу выделить функцию, которая будет подсчитывать символы в массиве int main() { int i =...

Сообщение об ошибке "Имя... не распознано как имя командлета, функции, файла сценария..." при вызове функции
Добрый день уважемые коллеги. Написал простой скрипт который мониторит создались ли файлы с...

Функция sizeof вызванная в другой функции выдает неправильное значение
Не могу понять, почему функция sizeof вызванная в другой функции выдает неправильное значение....

Что обозначает строка вида sizeof(data)/sizeof(data[0])?
#include &quot;stdafx.h&quot; #include &lt;stdio.h&gt; void bubble_sort(float *data, int size) { int i,j; ...

Как употребить в функции fseek -sizeof(int)? Ошибка: употребление унарного минуса
Как употребить в функции fseek -sizeof(int)? Ошибка: употребление унарного минуса

Marshal.SizeOf и sizeof
чем отличаются Marshal.SizeOf и sizeof? я просто почему то привык пользоваться Marshal.SizeOf, так...


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru