Можно ли дважды разыменовать («**itOpt») необязательный итератор?C++

Программы на C++. Форум разработчиков
Anonymous
Можно ли дважды разыменовать («**itOpt») необязательный итератор?

Сообщение Anonymous »

Если у меня есть std::optional, обернутый (скажем)

Код: Выделить всё

std::vector::const_iterator
, безопасно ли получить доступ к указанному
элементу с помощью двух последовательных разыменований () операторы?
Например:

Код: Выделить всё

  typedef std::vector IVec;

// Get a valid iterator.
IVec::const_iterator it = ivec.cbegin();
assert(it != ivec.end());

// Wrap it in an optional.
std::optional itOpt(it);
assert(itOpt);

// Access the iterator via double dereference.
return **itOpt;
Насколько я могу судить, это нормально, пока iec не является локальным, но
Кланг жалуется:

Предупреждение: ссылка на стековую память, связанную с локальной переменной 'itOpt', возвращена [-Wreturn-stack-address]

Полный пример:

Код: Выделить всё

// test.cc
// Clang complains when accessing an optional iterator.

#include                      // assert
#include                     // std::cout
#include                     // std::optional
#include                       // std::vector

typedef std::vector IVec;
IVec ivec;

int const &getVecElementRef()
{
// Get a valid iterator.
IVec::const_iterator it = ivec.cbegin();
assert(it != ivec.end());

// Wrap it in an optional.
std::optional itOpt(it);
assert(itOpt);

#if 1
// Access the iterator via double dereference.
//
// Clang complains: warning: reference to stack memory associated with
// local variable 'itOpt' returned [-Wreturn-stack-address]
return **itOpt;

#else
// This works fine (with or without the `const &` part).
auto const &tmp = *itOpt;
return *tmp;
#endif
}

int main()
{
ivec.push_back(0);

// Get an element reference using operator[].
int const &v0 = ivec[0];
std::cout 

Подробнее здесь: [url]https://stackoverflow.com/questions/78656796/is-it-ok-to-double-dereference-itopt-an-optional-iterator[/url]

Вернуться в «C++»