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*)
.
hac*_*cks 19
new
operator返回指向已分配内存的指针.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)