Потому что проблема со ссылками была только одним примером того, как можно использовать scopeguard.Но это должно работать (и работать правильно) во всех остальных случаях.Таким образом, имея эту функцию очистки:
void my_exit(const std::string & msg)
{
std::cout << "my_exit: " << msg << std::endl;
}
Это должно работать (передача временного объекта):
void test()
{
std::string msg("test_1 Hello World");
ON_BLOCK_EXIT(&my_exit, msg.substr(0, 6));
}
Это должно работать (передача ссылки на объект, который будет уничтожен доscopeguard называется):
void test()
{
std::map<int, std::string> m;
m[42] = "test_2";
ON_BLOCK_EXIT(my_exit, m[42]);
m.clear();
}
И это должно сработать (передавая константную ссылку):
void test(const std::string & msg)
{
ON_BLOCK_EXIT(&my_exit, msg);
}
Если parm
является константной или неконстантной ссылкой, тогда эти примерылибо не компилируется, либо вылетает при запуске.