You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何C++标准规定对prvalue的sizeof操作符需执行临时对象实质化?

为什么sizeof(Foo{})不需要在运行时创建临时对象?

首先明确:标准中提到的临时对象实质化,在sizeof场景下是编译期的概念,不会导致运行时创建临时对象。

标准规定的背景

C++标准(N4860)指出临时对象仅在必要时创建,并列出了触发临时对象实质化的场景,其中包括针对某些未求值操作数的情况;同时明确sizeof的prvalue操作数会应用临时对象实质化转换。

相关标准条款整理如下:

[class.temporary]
临时对象的实质化通常会尽可能延迟,以避免创建不必要的临时对象。[注:以下场景会触发临时对象实质化:
(2.1) — 将引用绑定到prvalue时,
(2.2) — 对类prvalue执行成员访问时,
(2.3) — 对数组prvalue执行数组到指针转换或下标操作时,
(2.4) — 使用花括号初始化列表初始化std::initializer_list<T>类型对象时,
(2.5) — 针对某些未求值操作数时,
(2.6) — 当类型为非cv void的prvalue作为丢弃值表达式出现时。

[expr.sizeof]
若操作数为prvalue,则会应用临时对象实质化转换。

核心解释

sizeof是编译期求值的操作符,它的作用是获取类型或表达式结果的大小,这个过程完全在编译阶段完成,不需要运行时执行任何代码。

标准中要求对sizeof的prvalue操作数做实质化转换,目的是为了明确该prvalue对应的具体类型——比如Foo{}是类类型的prvalue,实质化转换只是在编译期确认它的类型是Foo,进而计算Foo类型的大小,不会在运行时生成任何创建临时对象的指令。

编译器在处理sizeof(Foo{})时,只会推导Foo{}的类型,然后直接返回该类型的大小,不会生成构造临时对象的代码。所谓的“实质化”在这里只是编译期的类型推导步骤,和运行时的对象创建没有关系。


内容的提问来源于stack exchange,提问作者Ivan Morozko

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 18:25:04