sociologia segun origen memetica memes meme los importancia fenomeno ensayo definicion comunicacion autores analisis c++ c++11 initialization list-initialization narrowing

c++ - segun - ¿Por qué aparece una advertencia de conversión de estrechamiento solo en caso de inicialización de la lista?



meme y memetica (3)

La razón detrás de la advertencia ya está explicada por otras respuestas.

Esta es la forma de corregir esta advertencia / error. Crea un constructor que tome initializer_list como argumento.

A(std::initializer_list<int> l) : value(*(l.begin())) { cout << "constructor taking initializer list called/n"; }

Tengo el siguiente código:

class A { public: A(const unsigned int val) : value(val) {} unsigned int value; }; int main() { int val = 42; A a(val); A b{val}; // <--- Warning in GCC, error in Microsoft Visual Studio 2015 return 0; }

¿Por qué la advertencia de conversión de estrechamiento aparece solo en caso de uso de inicialización de lista?


Según el estándar, las conversiones de reducción son ilegales en ese contexto. Ellos son legales en el otro contexto. (Por "ilegal", quiero decir que el programa está mal formado).

El estándar requiere que un compilador emita un diagnóstico en ese caso particular (de hacer el programa mal formado). Lo que hace el compilador después de emitir el diagnóstico, el estándar no se define.

MSVC elige detener la compilación. Gcc elige emitir demonios nasales para simular que el programa tiene sentido, y hacer la conversión, y continuar compilando.

Ambas advertencias y errores son diagnósticos en lo que respecta al estándar. Tradicionalmente, los errores son lo que usted llama diagnósticos que preceden al compilador que detiene la compilación.

También tenga en cuenta que los compiladores son libres de emitir diagnósticos cuando lo deseen.

Tradicionalmente, las advertencias se usan cuando se hace algo que el estándar dictamina es un programa bien formado, pero los autores del compilador lo consideran desacertado y los errores cuando el estándar detecta un programa mal formado, pero la mayoría de los compiladores no lo hacen cumplir estrictamente.


la inicialización de la lista se introdujo desde C ++ 11 con la función que prohíbe las conversiones de estrechamiento implícito entre los tipos incorporados. Al mismo tiempo, las otras dos formas de inicialización de "estilo antiguo" (desde C ++ 98) que usan paréntesis e igual-signo como

int val = 42; A a(val); A a = val;

no modifique su comportamiento para que coincida con la inicialización de la lista, porque eso podría romper muchas bases de códigos heredadas.