Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
В этом случае можно считать, что объект S() начнет разрушаться после вызова функции f()
#include <iostream>
struct foo {
foo() {}
~foo() {
std::cout << "~foo()\n";
}
};
struct foo_holder {
const foo &f;
};
int main() {
foo_holder holder = { foo() };
std::cout << "done!\n";
return 0;
}int& r = 1; // не компилируется
test.cpp:3:11: ошибка: invalid initialization of non-const reference of type «int&» from an rvalue of type «int»
const int& r = 1;
Когда время жизни объекта определяется временем жизни ссылки на него
Вау, можно создавать константный ссылки на rvalue объекты (и это работает если у них одна область видимости)
foo_holder holder = { foo() };
#include <iostream>
class Temp
{
public:
Temp(int i):i_(i){std::cout << "Temp(" << i_ << ")\n";}
~Temp(){std::cout << "~Temp(" << i_ << ")\n";}
private:
int i_;
};
int main()
{
std::cout << "Start main\n";
Temp(1);
const Temp& ref = Temp(2);
std::cout << "Finish main\n";
}
Start main
Temp(1)
~Temp(1)
Temp(2)
Finish main
~Temp(2)
SomeClass object = SomeFunction();
const SomeClass& object = SomeFunction();
struct Computing {
Computing() : Current() {}
Computing& Plus(int argument) {
Current += argument;
return *this;
}
int GetResult() const {
return Current;
}
private:
int Current;
};
Computing Zero() {
return Computing();
}
int main() {
const Computing& result = Zero().Plus(1); // ВНИМАНИЕ: Баг!
std::cout << result.GetResult(); // Неопределенное поведение
}
#include <iostream>
struct Computing {
Computing() :
Current() {
std::cout << "build Computing\n";
}
~Computing() {
Current = 0;
std::cout << "destroy Computing\n";
}
Computing& Plus(int argument) {
std::cout << "plus argument\n";
Current += argument;
return *this;
}
int GetResult() const {
std::cout << "getting result\n";
return Current;
}
Computing(const Computing& other) {
std::cout << "copy constructor Computing\n";
Current = other.Current;
}
private:
int Current;
};
Computing Zero() {
return Computing();
}
int main() {
std::cout << "start correct code\n";
{
Computing result = Zero().Plus(1);
std::cout << "result is " << result.GetResult() << "\n";
}
std::cout << "finish correct code\n";
std::cout << "\nstart incorrect code\n";
{
const Computing& result = Zero().Plus(1); // ВНИМАНИЕ: Баг!
std::cout << "result is " << result.GetResult() << "\n"; // Неопределенное поведение
}
std::cout << "finish incorrect code\n";
}
C++: Когда время жизни объекта определяется временем жизни ссылки на него