Tag: LANGUAGE-LAWYER
#include <iostream> #define Abc likely #if __has_cpp_attribute(Abc) #define Pn 0 #endif #if __has_cpp_attribute(likely) #ifndef Pn #define Pn 1 #endif #endif int main(){ std::cout << Pn; } En este ejemplo, GCC imprime 0 mientras que Clang imprime 1. Según [cpp.cond] p5: Cada expresión __has_cpp_attribute se reemplaza por un número pp no . . . Read more
El siguiente ejemplo mínimo reproducible contiene una plantilla “struct B” con un tipo de argumento predeterminado que contiene una lambda “A<[]{ return 1; }>”, “B” se hereda recursivamente de “B<>”. Y hay una especialización de “B” para cualquier “A“. template<auto> struct A{}; template<class = A<[]{ return 1; }>> struct B . . . Read more
En la siguiente definición de la plantilla struct B, se utiliza una lambda como valor predeterminado de un argumento de plantilla no tipo, y en el cuerpo de la lambda se define un tipo A: template <auto ==”” []{=”” struct=”” a{};=”” }=””> struct B {}; Clang y MSVC no tienen . . . Read more
Tenga en cuenta que esta es puramente una pregunta académica, desde una perspectiva legal del lenguaje. Se trata de la forma teóricamente más segura de lograr la conversión. Supongamos que tengo un ‘void*’ y necesito convertirlo a un entero de 64 bits. La razón es que este puntero contiene la . . . Read more
Por razones legadas de C, las siguientes definiciones en C++ son equivalentes: void foo() {} void foo(void) {} ¿Qué sucede cuando foo está en una clase con plantillas? Por ejemplo: template <typename t=””> struct C { void foo(T) {} }; int main() { C<void> c; c.foo(); } MSVC (19.30) acepta . . . Read more