Tipos, Valores e Referências¶
Os tipos de C++ determinam operações válidas, representação, seleção de overload, regras de vida dos objetos e restrições genéricas.
Tipos fundamentais e compostos¶
Tipos fundamentais incluem booleanos, caracteres, inteiros, ponto flutuante e
void. As larguras de int e long não são universais; use tipos como
std::int32_t somente quando disponíveis e quando a largura integrar o contrato.
Tipos compostos incluem arrays, funções, ponteiros, referências, classes, enums e ponteiros para membros.
int value = 42;
int* pointer = &value; // may be reseated; can be null
int& reference = value; // aliases value; must be initialized
int const& view = value; // read-only access through this reference
const restringe mutação por um caminho de acesso; não prova que outro alias não
possa alterar o objeto. Constância lógica pode permitir caches cuidadosamente
sincronizados via mutable, mas mutação indiscriminada viola expectativas.
Categorias de valor¶
Expressões possuem tipo e categoria de valor:
- lvalue: identifica objeto ou função com identidade persistente;
- xvalue: identifica objeto cujos recursos podem ser reutilizados;
- prvalue: calcula valor para inicializar objeto ou operando.
Elas influenciam vínculo de referências, overload, materialização, cópia e movimentação. “Tudo está na stack ou no heap” não é o modelo de objetos de C++.
Inicialização¶
Inicialização com chaves rejeita muitas conversões estreitadoras. auto deduz o
tipo do inicializador; não torna C++ dinamicamente tipado. Verifique a dedução
quando referências, const superior, proxies ou listas importarem.
Conversões¶
Conversões implícitas alteram sinal, faixa, precisão ou overload. Aritmética signed/unsigned produz comparações surpreendentes. Prefira conversões explícitas e valide antes de estreitar.
static_cast: conversão da linguagem verificada em compilação;dynamic_cast: verificação em runtime em hierarquias polimórficas;const_cast: altera qualificação cv, mas não torna objeto realmente const mutável;reinterpret_cast: reinterpretação de baixo nível com usos restritos.
Views e vida útil¶
std::span<T> observa elementos contíguos; std::string_view, caracteres. Nenhum normalmente possui o armazenamento.
std::string_view invalid_view() {
std::string local{"temporary"};
return local; // dangling view after local is destroyed
}
Toda view não proprietária exige que o objeto referenciado sobreviva a todos os usos.
Exercícios¶
- Diferencie
int const*,int* consteint const* const. - Encontre o defeito de vida útil ao retornar view de armazenamento local.
- Explique por que
autopreserva tipagem estática.