内置类型赋值时,左值修改是否严格晚于右值求值?
关于内置类型赋值操作中
a = f()的修改时机问题 问题背景
已知a是类型T的变量,f()是返回可赋值给T类型的函数(且f()不修改a),考虑代码:
a = f();
对于用户自定义类型,因为a = f()本质是调用operator=()成员函数,参数f()的求值会在进入函数体前完成,所以可以确定a只会在f()求值完成后才被修改。
现在疑问是:对于内置类型,a中的数据是否绝不会在f()求值完成前被修改?
此问题的核心目的是确保当f()抛出异常时,a的数据不会被破坏。
解答
对于C++中的内置类型赋值操作,标准明确规定了操作的求值顺序:赋值运算符的右侧操作数(也就是f())会先被完整求值,得到结果后才会执行赋值操作修改左侧的a。
也就是说,不管是内置类型还是自定义类型,f()的求值过程都发生在a被修改之前。如果f()在求值过程中抛出异常,那么赋值操作根本不会开始执行,a的原有数据会保持完全不变,不会被破坏。
这是C++标准对赋值运算符求值顺序的强制要求,不存在内置类型和自定义类型在这一点上的差异——自定义类型是通过函数调用的规则保证参数先求值,而内置类型则是直接由标准规定的求值顺序来保证。
所以结论是:对于内置类型,a中的数据绝不会在f()求值完成前被修改,当f()抛出异常时,a的原有数据不会被破坏。
内容的提问来源于stack exchange,提问作者CPPL
相关产品推荐
相关产品推荐

