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 […]
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 […]
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é […]
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 […]
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 […]
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 = […]
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 = [&] () […]
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) […]
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 […]
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 […]