临时对象:没有命名,不会出现在源代码中
- 帮助隐式类型转换成功而创建的对象
- 编译器创建一个类型为string的临时对象,以buffer作为参数,调用string的构造函数;
- str绑定到了这个临时对象上
- 函数返回时,这个临时对象会自动销毁
- 这种情况只会出现在以值传递或者以const引用传递的函数里
- 非const引用不会出现转换,因为他不能保证临时对象不被改变
- 解决方案:【More Effective C++】条款21:用重载技术避免隐式类型转换-CSDN博客
size_t countChar(const string& str, char ch);
void uppercasify(std::string& str);
#define MAX_STRING_LEN 10
int main() {char buffer[MAX_STRING_LEN];char c;std::cin >> c >> std::setw(MAX_STRING_LEN) >> buffer;std::cout << countChar(buffer, c);uppercasify(buffer); // 编译失败// error: cannot bind non-const lvalue reference of type ‘std::string&’ to an rvalue of type ‘std::string’return 0;
}
- 函数必须返回一个对象时候
- 会创建一个临时对象,并付出析构和构造的成本
- 解决方案:采用RVO优化:【More Effective C++】条款20:返回值优化RVO-CSDN博客
class Number {};
const Number operator+(const Number& lhs, const Number& rhs);