Использование std :: эксперимент :: :: необязательно, давая ошибки компиляции - PullRequest
0 голосов
/ 02 июля 2018

Я использую опциональную функцию в первый раз, любая идея, что не так в этом коде, я хочу получить значение из кортежа, который хранится в retCode

#include <iostream>
#include <experimental/optional>
std::experimental::optional<std::tuple<uint16_t, uint32_t, uint32_t>> addEntity();

  std::experimental::optional<std::tuple<uint16_t, uint32_t, uint32_t>> addEntity() {
    uint32_t ipR = 1111;
    uint32_t ipU = 2222;
    uint16_t entityId = 0;
    return std::make_tuple(entityId, ipR, ipU);
  }


int main()
{
  auto retCode =  addEntity();
  std::cout<<std::get<0>(retCode)<<std::endl;
  return 0;

}

Ошибки компиляции

g++ experiment.cpp
In file included from /usr/include/c++/7/bits/move.h:54:0,
                 from /usr/include/c++/7/bits/nested_exception.h:40,
                 from /usr/include/c++/7/exception:143,
                 from /usr/include/c++/7/ios:39,
                 from /usr/include/c++/7/ostream:38,
                 from /usr/include/c++/7/iostream:39,
                 from experiment.cpp:1:
/usr/include/c++/7/type_traits: In instantiation of ‘struct std::is_trivially_destructible<std::tuple<short unsigned int, unsigned int, unsigned int> >’:
/usr/include/c++/7/experimental/optional:203:5:   required from ‘class std::experimental::fundamentals_v1::optional<std::tuple<short unsigned int, unsigned int, unsigned int> >’

1 Ответ

0 голосов
/ 02 июля 2018

Нет неявного преобразования из optional<T> в T, вам нужно извлечь значение.

int main()
{
  auto retCode =  addEntity();
  std::cout<<std::get<0>(retCode.value())<<std::endl; // can throw std::bad_optional_access
  return 0;
}

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

...