Deixe-me começar com um C++
código que simplifica os problemas que enfrentei na base de código real. Eu o compilei com --std=c++20
e --std=c++17
. O primeiro for-loop abaixo funcionou bem; o segundo for-loop, que retorna, std::optional<Container>
não funcionou, para todos os contêineres que testei. Gostaria de entender o porquê:
#include <iostream>
#include <optional>
#include <string>
#include <unordered_set>
std::unordered_set<std::string> GenerateSet() {
std::unordered_set<std::string> names = {"a", "b"};
return names;
}
std::optional<std::unordered_set<std::string>> GenerateOptionalSet() {
std::unordered_set<std::string> names = {"a", "b"};
return names;
}
int main() {
std::cout << "When a set is returned: {";
for (const auto& e : GenerateSet()) {
std::cout << e << " ";
}
std::cout << "}" << std::endl;
std::cout << "When a optional of a set is returned: {";
for (const auto& e : GenerateOptionalSet().value()) {
std::cout << e << " ";
}
std::cout << "}" << std::endl;
return 0;
}
O resultado foram falhas de segmentação em tempo de execução (bastante recente clang
) ou nenhuma iteração no segundo for-loop (bastante antigo gcc
em uma máquina Linux arcaica).
Aqui está o URL ao qual me referi em relação a std::optional<T>::value()
:
std::optional::value() do cppreference.com
Parece haver 4 versões diferentes. Não tinha certeza de qual versão das 4 funções substituídas seria invocada e por que não funciona como eu esperava (ou seja, apenas repetindo o valor do temporary retornado std::optional<T>
).