Scopeguard и параметры по ссылке - PullRequest
0 голосов
/ 08 мая 2011

В этой статье в разделе Поддержка параметров по ссылке они указывают на проблему и предоставляют решение для ссылок.Мой вопрос: почему они просто не объявляют параметры как ссылки в первую очередь?Т.е. вместо:

const Parm parm_;

сделать:

Parm &parm_;

Ответы [ 3 ]

0 голосов
/ 08 мая 2011

Существует одна проблема: временные ссылки в C ++ не могут быть привязаны к ссылкам, а только к константным ссылкам.

Следовательно, нельзя написать следующее:

int foo();

int& i = foo();

Если вы не используете Visual C ++, который позволяет использовать его как расширение языка.

Кроме того, если бы я использовал функцию, которая возвращает константную ссылку, то она также не работала бы.

Здесь нет простого решения:)

По крайней мере, до тех пор, пока C ++ 0x лямбды не будут введены в картинку .

0 голосов
/ 03 июля 2015

Потому что проблема со ссылками была только одним примером того, как можно использовать 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 является константной или неконстантной ссылкой, тогда эти примерылибо не компилируется, либо вылетает при запуске.

0 голосов
/ 08 мая 2011

Это должно быть

const Param &param_;

, чтобы учесть общий случай, и тогда вы столкнетесь с той же проблемой, пытаясь уменьшить или каким-либо другим способом изменить параметр.Другой вариант - создать намного больше классов для обработки константных и неконстантных версий.

Использование ссылки не позволит использовать результат выражения в качестве параметра, поскольку временная ссылка, созданная в качестве параметра функции, будетнемедленно выходит за рамки.

Хотя он мог бы удалить все константы и позволить им быть частью типа, а не разрешать выражения, я думаю, что по-прежнему большое значение требует, чтобы ByRef помог в ясности.

...