Digamos que eu tenho o código abaixo (muito simples).
#include <iostream>
int main() {
std::cout << std::stoi("12");
}
Isso compila bem no g ++ e no clang; no entanto, ele falha ao compilar no MSVC com o seguinte erro:
erro C2039: 'stoi': não é membro de 'std'
erro C3861: 'stoi': identificador não encontrado
Eu sei que isso std::stoifaz parte do <string>cabeçalho, o que provavelmente os dois ex-compiladores incluem como parte <iostream>e o último não. De acordo com o padrão C ++ [res.on.headers]
Um cabeçalho C ++ pode incluir outros cabeçalhos C ++.
O que, para mim, basicamente diz que todos os três compiladores estão corretos.
Esse problema surgiu quando um dos meus alunos enviou um trabalho que o AT marcou como não compilando; Claro que fui e consertei. No entanto, gostaria de evitar futuros incidentes como esse. Portanto, existe uma maneira de determinar quais arquivos de cabeçalho devem ser incluídos, com exceção da compilação em três compiladores diferentes para verificar sempre?
A única maneira de pensar é garantir que, para cada stdchamada de função, exista uma inclusão apropriada; mas se você tiver um código existente com milhares de linhas, pode ser entediante pesquisar. Existe uma maneira mais fácil / melhor de garantir a compatibilidade entre compiladores?
Exemplo com os três compiladores: https://godbolt.org/z/kJhS6U
std::stoi, você imediatamente se certifica de que também #include <string>está presente.
std::stoié para lidar com seqüências de caracteres, você pode adivinhar que<string>seria um bom cabeçalho para incluir. Ou você pode procurar uma boa referência que lhe dirá. E eu recomendo que você sempre inclua explicitamente os arquivos de cabeçalho, para que não precise confiar no comportamento específico da implementação não portátil.