Код: Выделить всё
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;
Кланг жалуется:
Предупреждение: ссылка на стековую память, связанную с локальной переменной '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]