Возвращение локальной функции-функции в качестве ссылки - PullRequest
2 голосов
/ 25 июля 2011

Я нашел этот исходный код:

inline GUID& WString2Guid(wstring src)
{
    static GUID result;
    HRESULT hr = ::CLSIDFromString(W2OLE(const_cast<WCHAR*>(src.c_str())), &result);
    if (FAILED(hr)) {
        //ERROR: The string '%s' is not formatted as a GUID!
        throw(E_INVALIDARG);
    }
    return result;
}

Какая польза от возврата ссылки здесь?Вызывающий код в любом случае не может получить ссылку, потому что к тому времени переменная покинет свою область видимости.Так что же, этот маленький знак & имеет какое-то значение?

Чтобы прояснить / расширить вопрос: в той же программе-примере функция называется

GUID guid = WString2Guid(id); // way 1

Если я хотел сделатьпользуясь ссылкой, я не должен был бы звонить

GUID& guid = WString2Guid(id); // way 2

вместо этого?

И еще один вопрос;почему функция CLSIDFromString вызывается с оператором :: раньше?Это имело бы смысл только в том случае, если бы была объявлена ​​другая локальная функция с тем же именем, не так ли?

Ответы [ 4 ]

11 голосов
/ 25 июля 2011

Нет.result является локальной переменной static, поэтому она будет существовать даже после выхода из функции.Не путайте это с нестатической локальной переменной.

:: в ::CLSIDFromString говорит компилятору выбрать CLSIDFromString из глобального пространства имен, в случае если определено много определений CLSIDFromStringв других пространствах имен, видимых на сайте вызова.

1 голос
/ 25 июля 2011

Ключевым битом является ключевое слово static.Он связывает result с самой функцией, а не с конкретным вызовом функции.Он продолжает работать после возврата определенного вызова, поэтому его можно безопасно вернуть по ссылке.

Оператор разрешения области действия (::) сам по себе аналогично тому, что делает вызов CLSIDFromString в глобальном пространстве имен.Возможно, у автора кода была другая версия этой функции где-то в его собственном пространстве имен.Компилятор скажет вам, является ли вызов функции неоднозначным, и, следовательно, вам необходимо добавить его.Даже если вызов не неоднозначен, он ничего не повредит, находясь там.

1 голос
/ 25 июля 2011

Переменная является статической, поэтому она останется в живых. Но в любом случае это глупый код, он должен просто возвращать GUID по значению. Оператор области видимости - это, вероятно, личное предпочтение стиля.

0 голосов
/ 25 июля 2011

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

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