web-dev-qa-db-fra.com

Pouvez-vous `= supprimer` une fonction de modèle sur une deuxième déclaration?

Considérez le code suivant:

template <typename T> int foo();
template <typename T> int foo() = delete;

est-ce valide C++ 11?

  • GCC (9.1) dit: Oui!
  • clang (8.0) dit: Non!
  • nvcc (9.2) dit: Non!
  • MSVC (19.20) dit: Oui! (en mode C++ 14, il ne prend pas en charge C++ 11.)

... tout voir sur GodBolt .

alors quels compilateurs ont raison et quels compilateurs sont s @ # $% e? :-)

18
einpoklum

GCC et MSVC ont un bug.

[dcl.fct.def.delete]

4 ... Une définition supprimée d'une fonction doit être la première déclaration de la fonction ou, pour une spécialisation explicite d'un modèle de fonction, la première déclaration de cette spécialisation ...

Ce qui, je crois, représente également des déclarations et des définitions instanciées. Étant donné que la référence à une fonction supprimée est une erreur matérielle, elle doit être déclarée supprimée dès que possible.