Является ли "sizeof new int;"неопределенное поведение? - PullRequest
0 голосов
/ 03 октября 2018

код:

#include<iostream>

using namespace std;

int main() 
{
    size_t i = sizeof new int;

    cout<<i;
}

В компиляторе GCC работает нормально без каких-либо предупреждений или ошибок и выводит на печать 8.

Но в компиляторе clangЯ получил следующее предупреждение:

warning: expression with side effects has no effect in an unevaluated context [-Wunevaluated-expression]
    size_t i = sizeof new int;
  • Какая истина?
  • Является ли sizeof new int; неопределенным поведением?

Ответы [ 2 ]

0 голосов
/ 03 октября 2018

new оператор возвращает указатель на выделенную память.new int вернет указатель, поэтому sizeof new int; вернет размер указателя.Это действительный код, и здесь нет неопределенного поведения .

Предупреждение является допустимым и предупреждает только о влиянии побочного эффекта на операнд, и это потому, что операнды sizeof не оцениваются.

Например:

int i = 1;
std::cout << i << '\n';     // Prints 1
size_t size = sizeof(i++);  // i++ will not be evaluated
std::cout << i << '\n';     // Prints 1
0 голосов
/ 03 октября 2018

В предупреждении не указано, что это UB;это просто говорит о том, что контекст использования, а именно sizeof, не будет вызывать побочные эффекты (которые в случае new выделяют память).

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

Стандарт также помогает объяснить, что это означает:

[expr.context] (...) Неоцененный операнд не оценивается.

Это хороший, хотя и странный способ написать sizeof(int*).

...