Как оператор sizeof может вычислить размер возвращаемого типа функции? - PullRequest
3 голосов
/ 15 июня 2019

1001 * код-*

#include <bits/stdc++.h>
using namespace std;

 int *fun()
 {  static int a; 
     ++a; 
     cout<<"value of a = "<<a<<endl;
     return &a;
  } 

 int main() {
 cout<<"simple call \n"; 
 fun(); 
 cout<<"calling inside sizeof \n"; 
  cout<<sizeof(fun())<<endl;
  cout<<"calling inside pow \n";  
  cout<<pow(2,*fun())<<endl;
  return 0;
 }

Выход-

simple call 
value of a = 1 
calling inside sizeof 
8 
calling inside pow 
value of a = 2
4

Я сомневаюсь, как оператор sizeof вычисляет размер возвращаемого типа функции. Я предполагаю, что сначала вызывается функция, затем она возвращает адрес своей статической переменной, и оператор sizeof оперирует этим значением. Но здесь прямо указывается размер указателя. И если я использую то же самое удовольствие внутри pow (), то он сначала вызывается, а затем выполняется дальнейший расчет.

1 Ответ

3 голосов
/ 15 июня 2019

Нет, sizeof никогда не оценивает свои операнды (за исключением массивов переменной длины C, но, поскольку это вопрос C ++, это не имеет значения). От C++17 [expr.sizeof]:

Оператор sizeof возвращает количество байтов в объектном представлении своего операнда. Операндом является либо выражение, представляющее собой неоцененный операнд (пункт 8), либо идентификатор типа в скобках.

В вашем случае, поскольку fun() возвращает int * (компилятор знает это, потому что вы так сказали), это как если бы вы запросили sizeof(int *).

...