Articles of langage avocat

Quelle est la sémantique exacte d’une fonction supprimée dans C ++ 11?

struct A { A(); A(const A&); A& operator =(const A&); A(A&&) = delete; A& operator =(A&&) = delete; }; struct B { B(); B(const B&); B& operator =(const B&); }; int main() { A a; a = A(); // error C2280 B b; b = B(); // OK } Mon compilateur est VC ++ 2013 […]

En C ++ 11, est-ce que `i + = ++ i + 1` présente un comportement indéfini?

Cette question a été soulevée pendant que je lisais (les réponses à) Alors, pourquoi i = ++ i + 1 est-il bien défini en C ++ 11? Je suppose que l’explication subtile est que (1) l’expression ++i renvoie une lvalue mais que + prend des valeurs comme opérandes, donc une conversion de lvalue en valeur […]

Le premier extrait ci-dessous est compilé, mais pas le second. Pourquoi?

L’extrait ci-dessous comstack ( démo ): struct A{ int i = 10; }; int main() { struct A{ int i = 20; }; struct A; struct A a; } Mais ce n’est pas le cas: struct A{ int i = 10; }; int main() { // struct A{ int i = 20; }; struct A; […]

Initialisation d’un tableau de zéros

Il est bien connu que les initialiseurs manquants pour un tableau de scalaires sont mis à zéro par défaut. int A[5]; // Ensortinges remain uninitialized int B[5]= { 0 }; // All ensortinges set to zero Mais est-ce (ci-dessous) garanti? int C[5]= { }; // All ensortinges set to zero

Est-ce que le «paresseux enable_if» est légal en C ++?

J’utilise fréquemment une technique que j’appelle “l’homme paresseux enable_if “, où j’utilise decltype et l’opérateur virgule pour activer une fonction basée sur des entrées de modèle. Voici un petit exemple: template auto foo(F&& f) -> decltype(f(0), void()) { std::cout << "1" << std::endl; } template auto foo(F&& f) -> decltype(f(0, 1), void()) { std::cout << […]

Quel est le nom de cette fonctionnalité de modèle C ++ inhabituelle utilisée par Boost.Spirit?

Le code ci-dessous provient de la documentation Boost.Spirit x3 . Il utilise une syntaxe C ++ intéressante que je n’avais jamais vue auparavant, ce qui est presque impossible à décrire dans une requête de recherche sans connaître la terminologie appropriée. Est-ce un raccourci pour la déclaration en avant d’une classe? Où cette fonctionnalité est-elle mentionnée […]

Les fonctions distinctes ont-elles des adresses distinctes?

Considérons ces deux fonctions: void foo() {} void bar() {} Est-ce que c’est garanti que &foo != &bar ? De même, template void foo() { } est-il garanti que &foo != &foo ? Il existe deux lieurs que je connais de ces définitions de fonctions de pli ensemble. MSVC agressivement COMDAT se replie fonctions, donc […]

Est-ce que ++ x% = 10 est bien défini en C ++?

En parcourant le code d’un projet, je suis tombé sur la déclaration suivante: ++x %= 10; Cette instruction est-elle bien définie en C ++ ou tombe-t-elle dans la même catégorie que a[i] = i++ ?

Utiliser `throw;` sur une exception modifiée

J’ai une fonction foo qui peut lancer une exception de bar . Dans une autre fonction, j’appelle foo mais j’ai la possibilité d’append plus de détails à l’exception de la bar si elle est lancée. (Je préférerais ne pas transmettre ces informations en tant que paramètre à foo car elles n’y appartiennent pas vraiment en […]

Pourquoi stdbool.h de clang contient-il #define false false

Après avoir été pointé par une erreur de compilation, j’ai remarqué que le fichier stdbool.h de stdbool.h inclut (entre autres) les lignes suivantes: #define bool bool #define false false #define true true Ils sont contenus dans un bloc #ifdef qui applique indirectement __cplusplus , d’où le tag c ++ même si stdbool.h est un en-tête […]