是"sizeof new int;" 未定义的行为?

msc*_*msc 32 c++ g++ sizeof c++11 clang++

码:

#include<iostream>

using namespace std;

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

    cout<<i;
}
Run Code Online (Sandbox Code Playgroud)

在GCC编译器中,工作正常,没有任何警告或错误和打印输出8.

但是,在clang编译器中,我收到了以下警告:

warning: expression with side effects has no effect in an unevaluated context [-Wunevaluated-expression]
    size_t i = sizeof new int;
Run Code Online (Sandbox Code Playgroud)
  • 哪一个是真的?
  • sizeof new int;未定义的行为?

Bar*_*icz 61

警告并未说明它是UB; 它只是说使用的上下文,即sizeof不会触发副作用(在new分配内存的情况下).

[expr.sizeof] sizeof运算符产生其操作数类型的非潜在重叠对象占用的字节数.操作数是表达式,它是未评估的操作数([expr.prop])或带括号的type-id.

该标准还有助于解释这意味着什么:

[expr.context](...)未评估未评估的操作数.

这是一个很好的,虽然写作很奇怪sizeof(int*).

  • *这很好,虽然编写`sizeof(int*)`是一种奇怪的方式.*我添加它可能是一种令人困惑的方式来编写`sizeof(int*)`,因为它很可能被视为`sizeof(int )`. (2认同)

hac*_*cks 19

newoperator返回指向已分配内存的指针.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
Run Code Online (Sandbox Code Playgroud)

  • @MaxBarraclough这是未指明的行为."如果size表达式是`sizeof`运算符的操作数的一部分,并且更改size表达式的值不会影响运算符的结果,则无论是否计算大小表达式都未指定." https://port70.net/~nsz/c/c11/n1570.html#6.7.6.2p5 (7认同)
  • @DanM; `int [i ++]`将在运行时计算,可变长度数组的异常.请注意,c ++不允许VLA,但GCC和clang将其作为扩展名提供. (6认同)
  • 奇怪的是,很容易对`i ++'进行评估:cpp.sh/9774o (4认同)