Articles of language lawyer

¿Hay una diferencia (semántica) entre el valor de retorno de la ubicación nueva y el valor de conversión de su operando?

¿Hay una diferencia (semántica) entre el valor de retorno de la ubicación nueva y el valor de conversión de su operando? struct Foo { … }; char buffer[…]; Foo *a = new(buffer) Foo; Foo *b = reinterpret_cast(buffer); ¿A y b difieren de alguna manera? EDITAR: Basado en el comentario de DaBler, esta pregunta dice que […]

Interacción entre decltype y el nombre de miembro de clase sombreando un nombre externo

Este código int clash; struct Foo { decltype(clash) clash; }; comstack silenciosamente en clang, pero no comstack en gcc dando los errores error: statement de ‘int Foo :: clash’ [-fpermissive] error: cambia el significado de ‘clash’ de ‘int clash’ [-fpermissive] Parece que se requieren 2 ingredientes para que surja el error: El sombreado debe hacerlo […]

¿Esto realmente rompe las reglas de alias estrictos?

Cuando compilo este código de muestra usando g ++, aparece esta advertencia: advertencia: desmarcar puntero tipo-punteado romperá reglas de alias estrictos [-Wstrict-aliasing] El código: #include int main() { alignas(int) char data[sizeof(int)]; int *myInt = new (data) int; *myInt = 34; std::cout << *reinterpret_cast(data); } En este caso, ¿alias de data no es un int, y […]

¿La metaprogtwigción con estado está mal formada (todavía)?

Uno de mis inventos más queridos / malvados que he tenido la fortuna de encontrar es el contador de constelaciones , también conocido como metaprogtwigción con estado. Como se menciona en la publicación, parece ser legal en C ++ 14, y me pregunto si algo ha cambiado con C ++ 17. La siguiente es una […]

Se eliminó el constructor predeterminado. Los objetos aún se pueden crear … a veces

La vista ingenua, optimista y oh … tan incorrecta de la syntax de inicialización uniforme de c ++ 11 Pensé que dado que los objetos de tipo C ++ 11 definidos por el usuario deberían construirse con la nueva syntax {…} lugar de la antigua (…) syntax (excepto para el constructor sobrecargado para std::initializer_list y […]

Comprender el ejemplo en la conversión lvalue-a-rvalue

Me cuesta entender cómo este código (un ejemplo del borrador del estándar C ++ 14 [conv.lval] ) invoca un comportamiento indefinido para g(false) . ¿Por qué constexpr hace que el progtwig sea válido? Además, ¿qué significa “no accede a yn “? En ambas llamadas a g() estamos devolviendo el miembro n datos, entonces ¿por qué […]

¿Es el desplazamiento a la izquierda (<<) un comportamiento indefinido de entero negativo en C ++ 11?

¿Es el cambio a la izquierda un comportamiento indefinido int internacional en C ++ 11? Los pasajes estándar relevantes aquí son de 5.8: 2 / El valor de E1 << E2 es E1 posiciones de bit E2 desplazadas a la izquierda; los bits vacantes están llenos a cero. Si E1 tiene un tipo sin signo, […]

La llamada al pseudo destructor no destruye un objeto

Considera el siguiente código: #include typedef int t; ta=42; int main() { at::~t(); std::cout << a; //42 } Se espera que a será destruido. Pero no es verdad, ¿por qué? ¿Cómo se destruirá el objeto esa llamada pseudo-destructor?

Autoinicialización de una variable de constexto estática, ¿está bien formada?

Dada la siguiente statement en el espacio de nombres global: constexpr int x = x; ¿Está bien formado? El borrador de la sección estándar de C ++ 14 3.6.2 [basic.start.init] dice: Las variables con duración de almacenamiento estático (3.7.1) o duración de almacenamiento de subprocesos (3.7.2) se inicializarán en cero (8.5) antes de que tenga […]

Entonces, ¿por qué i = ++ i + 1 está bien definido en C ++ 11?

He visto las otras preguntas similares y leí el defecto al respecto. Pero todavía no lo entiendo ¿Por qué i = ++i + 1 bien definido en C ++ 11 cuando i = i++ + 1 no? ¿Cómo el estándar lo hace bien definido? Al hacer ejercicio, tengo la siguiente secuencia antes del gráfico (donde […]