Desafio C++
Inicialização com chaves e narrowing
Enunciado
Escreva um programa que demonstre a prevenção de narrowing usando inicialização com chaves. Declare int a{10};, double b{3.14}; e tente declarar int c{3.14}; (deve causar erro de compilação). Comente a linha problemática e, em vez disso, declare int d{static_cast<int>(3.14)};. Imprima a, b e d com rótulos. Explique em comentário por que int c{3.14} não compila.
Requisitos
- Usar inicialização com chaves para
a,bed. - Comentar a linha
int c{3.14};e explicar o erro. - Usar
static_cast<int>para converter 3.14 para inteiro. - Imprimir
a: 10,b: 3.14ed: 3em linhas separadas.
Código inicial
#include <iostream>
int main() {
// Declare a, b e d com chaves
// int c{3.14}; // por que não compila?
// Imprima os valores
return 0;
}
Saída esperada
a: 10
b: 3.14
d: 3
Ver dica
Narrowing ocorre quando um valor de ponto flutuante é convertido para inteiro sem perda explícita.
Mostrar solução
#include <iostream>
int main() {
int a{10}; // inicialização com chaves
double b{3.14}; // double com chaves
// int c{3.14}; // ERRO: narrowing conversion de double para int
// O compilador rejeita porque 3.14 não é um inteiro exato.
int d{static_cast<int>(3.14)}; // conversão explícita, sem narrowing
std::cout << "a: " << a << "\n";
std::cout << "b: " << b << "\n";
std::cout << "d: " << d << "\n";
return 0;
}
Passo a passo
int a{10};inicializa um inteiro com chaves, sem problemas.double b{3.14};inicializa um double com chaves, sem problemas.- A linha
int c{3.14};é comentada porque o compilador detecta narrowing: 3.14 não cabe exatamente em umint. - Usamos
static_cast<int>(3.14)para converter explicitamente, assumindo a perda da parte fracionária. int d{...}inicializadcom o valor convertido (3).- Imprimimos os três valores.
Por que funciona
A inicialização com chaves proíbe conversões que perdem informação (narrowing). Ao usar static_cast, informamos ao compilador que a conversão é intencional, permitindo a compilação.
Erros comuns
- Descomentar
int c{3.14};e tentar compilar: erro de narrowing. - Usar
int c = 3.14;em vez de chaves: compila, mas trunca silenciosamente para 3, o que pode ser indesejado. - Esquecer o
static_caste usarint d{3.14};diretamente: mesmo erro de narrowing.
Outra forma de resolver
Poderia usar int d = static_cast<int>(3.14); com sinal de igual, mas a inicialização com chaves é preferível por ser mais segura.
Saída esperada
a: 10
b: 3.14
d: 3