Articles of language avocats

Pourquoi ne peut-on pas utiliser la résolution de scope avec la déréférence de pointeur de membre?

Prenons un exemple simple: struct FooParent { virtual void bar() { } }; struct Foo: FooParent { void bar() { } }; int main() { Foo foo; void (Foo::*foo_member)() = &FooParent::bar; //(foo.*FooParent::foo_member)(); foo.FooParent::bar(); } Comme vous pouvez le constater, il est possible d’utiliser la résolution d’étendue sur l’object foo lorsqu’on appelle une fonction membre alors […]

C ++ 14 déduction du type d’argument par défaut de lambda en fonction des arguments précédents

N’est-ce pas valide en tant que C ++ 14? auto f = [](auto x, auto y = std::decay_t{}) { }; f(0); Je m’attendais à ce qu’il soit à peu près équivalent à auto f = [](int x, int y) { }; f(0, int{}); Ni GCC 6.3 ni Clang 4.0 n’ont accepté mon code. http://ideone.com/b7b4SK GCC […]

Résolution de surcharge: Comment cela n’est-il pas ambigu?

Supposons que nous ayons ce code, copié à partir d’une question distincte: namespace x { void f() { } class C { void f() { using x::f; f(); // <== } }; } Le nom f sur la ligne indiquée se réfère sans ambiguïté à x::f (au moins selon gcc et clang). Pourquoi x::f préféré […]

La génération de tables statiques fonctionne avec GCC mais pas de manière aléatoire; Est-ce que Clang a un bug?

Il était une fois, j’ai écrit du code qui générait un tableau / tableau statique lors de la compilation pour une métaprogrammation de modèles (l’idée est que les chaînes de style C peuvent être générées au moment de la compilation (ce sont juste des tableaux de caractères)). L’idée et le code sont basés sur la […]

L’initialisation de liste C ++ permet plusieurs conversions définies par l’utilisateur

Je lisais cette réponse , qui a l’exemple suivant: struct R {}; struct S { S(R); }; struct T { T(const T &); //1 T(S); //2 }; void f(T); void g(R r) { f({r}); } La réponse est liée à une ancienne version de [over.best.ics] / 4, qui ressemblait alors à ceci : Toutefois, lorsqu’on […]

Décalage de bits à gauche et rejet de bits

Considérons la fonction (l’une de ses implémentations possibles) qui mettrait à zéro les N bons bits d’une valeur courte non signée (ou tout autre type d’intégrale non signée). L’implémentation possible pourrait ressembler à ceci: template unsigned short zero_right(unsigned short arg) { using type = unsigned short; constexpr type mask = ~(type(0)); constexpr type right_zeros = […]

La norme C ++ impose-t-elle que la capture par référence des variables locales soit inefficace?

J’ai récemment eu besoin d’un lambda qui capturait plusieurs variables locales par référence. J’ai donc créé un extrait de test pour en évaluer l’efficacité, et je l’ai compilé avec -O3 aide de la règle 3.6: void do_something_with(void*); void test() { int a = 0, b = 0, c = 0; auto func = [&] () […]

Initialisation double attache

Quel constructeur doit être appelé dans le code suivant et pourquoi? struct S { int i; S() = default; S(void *) : i{1} { ; } }; S s{{}}; Si j’utilise clang (du tronc), le second est appelé. Si le second constructeur est mis en commentaire, alors S{{}} rest une expression valide, mais (je crois) […]

Les surcharges de l’opérateur d’égalité: Is (x! = Y) == (! (X == y))?

J’espère que ce n’est pas un doublon. J’ai cherché d’autres questions concernant les opérateurs d’égalité, mais à part quelques commentaires dans des questions connexes, je n’ai pas trouvé de déclaration tl; dr: La norme C ++ garantit-elle que (x!=y) toujours la même valeur de vérité que !(x==y) ? Je sais que beaucoup de subtilités sont […]

Lorsque je spécialise un cours, comment puis-je utiliser un nombre différent de parameters de modèle?

Je viens de poser cette question: Puis-je obtenir l’object propriétaire d’un paramètre de modèle de fonction membre? et Yakk – La réponse d’ Adam Nevraumont avait le code: template struct get_memfun_class; template struct get_memfun_class { using type=T; }; Ceci est clairement une déclaration initiale puis une spécialisation de struct get_memfun_class . Mais je me trouve […]