Articles of language lawyer

¿Por qué la inferencia de tipo genérico Java 8 elige esta sobrecarga?

Considere el siguiente progtwig: public class GenericTypeInference { public static void main(String[] args) { print(new SillyGenericWrapper().get()); } private static void print(Object object) { System.out.println(“Object”); } private static void print(String string) { System.out.println(“String”); } public static class SillyGenericWrapper { public T get() { return null; } } } Imprime “Cadena” en Java 8 y “Objeto” en […]

lanzando a través de void * en lugar de usar reinterpret_cast

Estoy leyendo un libro y descubrí que reinterpret_cast no se debe usar directamente, sino que se debe convertir a void * en combinación con static_cast : T1 * p1=… void *pv=p1; T2 * p2= static_cast(pv); En lugar de: T1 * p1=… T2 * p2= reinterpret_cast(p1); Sin embargo, no puedo encontrar una explicación de por qué […]

¿Sigue siendo un puntero con la dirección y el tipo correctos un puntero válido desde C ++ 17?

(En referencia a esta pregunta y respuesta .) Antes del estándar C ++ 17, la siguiente oración se incluyó en [basic.compound] / 3 : Si un objeto de tipo T está ubicado en una dirección A, se dice que un puntero de tipo cv T * cuyo valor es la dirección A apunta a ese […]

¿Es seguro push_back un elemento del mismo vector?

vector v; v.push_back(1); v.push_back(v[0]); Si el segundo push_back causa una reasignación, la referencia al primer entero en el vector ya no será válida. Entonces esto no es seguro? vector v; v.push_back(1); v.reserve(v.size() + 1); v.push_back(v[0]); Esto lo hace seguro?

¿Todavía es seguro eliminar nullptr en c ++ 0x?

En c++03 es bastante claro que eliminar un puntero nulo no tiene ningún efecto. De hecho, se establece explícitamente en §5.3.5/2 que: En cualquiera de las alternativas, si el valor del operando de eliminar es el puntero nulo, la operación no tiene efecto. Sin embargo, en el borrador actual para c++0x parece que falta esta […]

¿Por qué no se permite modificar una cadena a través de un puntero recuperado a sus datos?

En C ++ 11, los caracteres de una std::string deben almacenarse contiguamente, como lo indica el § 21.4.1 / 5: Los objetos tipo char en un objeto basic_string se deben almacenar contiguamente. Es decir, para cualquier objeto basic_string s, la identidad & * (s.begin () + n) == & * s.begin () + n se […]

Repetición de typedefs: ¿inválido en C pero válido en C ++?

Me gustaría una referencia estándar de por qué el siguiente código desencadena una advertencia de conformidad en C (probado con gcc -pedantic ; “redefinición typedef“), pero está bien en C ++ ( g++ -pedantic ): typedef struct Foo Foo; typedef struct Foo Foo; int main() { return 0; } ¿Por qué no puedo definir un […]

Usando std :: bind con la función de miembro, use el puntero del objeto o no para este argumento?

Al usar std::bind para enlazar una función miembro, el primer argumento es el objeto this puntero. Sin embargo, funciona pasando el objeto como un puntero y no como. Ver por ejemplo el siguiente progtwig: #include #include struct foo { void bar(int v) { std::cout << "foo::bar – " << v << '\n'; } }; int […]

c ++ accede a miembros estáticos con puntero nulo

Recientemente probé el siguiente progtwig y comstack, funciona bien y produce el resultado esperado en lugar de cualquier error de tiempo de ejecución. #include class demo { public: static void fun() { std::cout<fun(); std::cout<a; return 0; } Si se utiliza un puntero no inicializado para acceder a la clase y / o el comportamiento de […]

Acerca de enlazar una referencia constante a un subobjeto de un temporal

Con código como #include struct P { int x; P(int x) : x(x) {} ~P() { std::cout << "~P()\n"; } }; int main() { auto const& x = P{10}.x; std::cout << "extract\n"; } GCC imprime ~P() extract , lo que indica que la vida útil del temporal no se extiende por la referencia. Por el […]