当返回的变量超出函数的范围时,我对 C++ 返回值优化有很好的了解,但是返回成员变量呢?考虑以下代码:
#include <iostream>
#include <string>
class NamedObject {
public:
NamedObject(const char* name) : _name(name) {}
std::string name() const {return _name;}
private:
std::string _name;
};
int main(int argc, char** argv) {
NamedObject obj("name");
std::cout << "name length before clear: " << obj.name().length() << std::endl;
obj.name().clear();
std::cout << "name length after clear: " << obj.name().length() << std::endl;
return 0;
}
哪个输出:
name length before clear: 4
name length after clear: 4
显然,这些obj.name().clear()
行为是针对临时副本的,但是对 的调用obj.name.length()
呢?std::string::length()
是const
成员函数,因此保证不会修改字符串的状态。因此,应该允许编译器不复制成员变量而直接使用它来调用 const 成员函数,这似乎是合理的。现代 C++ 编译器是否进行了这种优化?有什么理由不应该或不能制作它吗?
编辑:
澄清一下,我不是在问标准返回值优化是否在这里有效;在我最初提出这个问题的时候,我明白为什么它没有。RVO 通常定义的方式在这里不起作用,因为返回的值不会超出函数的范围。
我要问的是:如果调用时的编译器可以确定调用没有副作用,是否允许跳过副本?即,它可以表现得好像
obj.name().length()
是
obj._name.length()