#include <expected>
#include <span>
#include <iostream>
int main() {
auto e = std::expected<std::span<char>, int>{};
std::cout << e.value().size() << std::endl;
}
Meu compilador é clang-19.1.5. Compile o código com o seguinte comando:
clang++-19 -std=c++2c -stdlib=libc++ ./toy.cpp -lc++abi -lunwind -lc++
A compilação e a vinculação estão corretas, mas um erro de tempo de execução é gerado:
./a.out: erro de pesquisa de símbolo: ./a.out: símbolo indefinido: _ZTINSt3__119bad_expected_accessIvEE
$ nm -D /usr/local/lib/libc++.so.1 | grep access
00000000000607b0 T _ZNKSt18bad_variant_access4whatEv
0000000000054040 T _ZNKSt19bad_optional_access4whatEv
0000000000054060 T _ZNSt12experimental19bad_optional_accessD0Ev
0000000000054050 T _ZNSt12experimental19bad_optional_accessD1Ev
0000000000054050 T _ZNSt12experimental19bad_optional_accessD2Ev
0000000000054020 T _ZNSt19bad_optional_accessD0Ev
0000000000054010 T _ZNSt19bad_optional_accessD1Ev
0000000000054010 T _ZNSt19bad_optional_accessD2Ev
00000000000ee248 D _ZTINSt12experimental19bad_optional_accessE
00000000000ee440 D _ZTISt18bad_variant_access
00000000000ee208 D _ZTISt19bad_optional_access
00000000000b024b R _ZTSNSt12experimental19bad_optional_accessE
00000000000ccded R _ZTSSt18bad_variant_access
00000000000b0233 R _ZTSSt19bad_optional_access
00000000000ee220 D _ZTVNSt12experimental19bad_optional_accessE
00000000000ee418 D _ZTVSt18bad_variant_access
00000000000ee1e0 D _ZTVSt19bad_optional_access
Se eu mudar -stdlib=libc++
para -stdlib=libstdc++
, então ok.
Por que std::expected
o libc++ não funciona?
Este símbolo está presente no pacote libc++ versão 19.1.6, mas não 18.1.8 (estou seguindo o que está presente no arquivo de pacotes do Arch Linux, já que esse é meu sistema, mas deve ser o mesmo para todas as distros). Atualizar para libc++-19 deve resolver. Você também pode verificar qual pacote possui o libc++.so ao qual você está vinculando no momento - se minha suposição estiver correta, deve ser libc++ <19.
Se você não tivesse esse pacote disponível nos repositórios, teria que atualizar a biblioteca manualmente, mas como você já tem o clang-19, obter a libc++-19 da mesma forma não deve causar problemas.
Note que várias partes do projeto LLVM são gerenciadas como pacotes separados - clang, llvm, libc++, libc++abi, lld... com suas próprias versões correspondentes. A atualização do sistema atualiza todos eles, mas eles não dependem um do outro, então atualizar um não atualizará todos automaticamente.