(c++20;工作草案N4868)
返回/2声明返回语句通过复制初始化初始化glvalue结果或prvalue结果对象
返回语句通过从操作数复制初始化(9.4)来初始化(显式或隐式)函数调用的glvalue结果或prvalue结果对象。
对于类类型,返回语句“调用”选定的构造函数并复制初始化变量obj (调用的结果对象),因为复制省略(实现是传递dest地址的调用者,因此被调用的函数通过构造函数调用初始化dest )。
class MyClass {
int x;
};
MyClass func() {
return MyClass(); //initializes the result object of the function call
}
int main() {
MyClass obj {func()}; //obj is the result object of func().
}dcl.init.general/16.6.1建议:
如果初始化器表达式是prvalue,且源类型的cv非限定版本与目标类相同,则初始化器表达式用于初始化目标对象。
对于int、double等基本类型,常见的实现是将操作数(返回表达式)复制到寄存器的返回语句。
(gcc 12.1 -std=c++20)
int func() {
return 2;
}
int main() {
int myInt {func()};
}func():
push rbp
mov rbp, rsp
mov eax, 2
pop rbp
ret
main:
push rbp
mov rbp, rsp
sub rsp, 16
call func()
mov DWORD PTR [rbp-4], eax
mov eax, 0
leave
ret在class.temporary/1.2,中,标准说,如果类型是“微不足道的可复制的”,是否有可能实现临时文档:
创建了1个临时对象 ..。 -(1.2)当执行程序需要传递或返回一个微不足道的可复制类型的物体时(见下文), ..。
问题
相关
发布于 2022-09-06 07:55:06
使用寄存器按值返回基本类型的实现是否会执行“临时物化”?
是。
实现是否类似于基本类型(int、double等)?使用类.临时/1.2作为源?
临时/(1.2)是对[class.temporary]/3的非规范性引用,实现不能用于非类类型,这是CWG2434的主题。
a必须在f()的返回语句中直接初始化,因为允许临时函数参数和class.temporary第3段中的返回类型的异常只适用于某些类类型。
这个要求是可以观察到的,因为示例中的X析构函数可以检查a的值。
本段中的权限也应适用于所有非类类型。发布于 2022-09-06 03:32:36
该标准描述的是行为,而不是实现。换句话说,CPU寄存器不是一个对象;在任何寄存器中存在任何值,在任何意义上都不是语言或程序(因为基本类型没有可能检测到它们的特殊成员函数)所能识别的副本。
类似地,使用调试器运行的程序的视图不需要对应于程序访问的任何状态。该实现使用寄存器之类的东西来提供语言的语义,但它不需要标准中的权限来以任何特定的方式来实现。
https://stackoverflow.com/questions/73615686
复制相似问题