2017-10-15 3 views
2

Je suis en train de compiler une bibliothèque C++ (avec 5.3.1-14ubuntu2 gcc) et a obtenu ce type d'erreur:fonction explicitement en défaut ne peut pas être déclarée comme constexpr parce que la déclaration implicite ne constexpr

> In file included from 
> /root/pitchfork/workspace/unanimity/include/pacbio/consensus/ModelConfig.h:49:0, 
>     from /root/pitchfork/workspace/unanimity/src/models/P6C4NoCovModel.cpp:42: 
> /root/pitchfork/workspace/unanimity/include/pacbio/data/internal/BaseEncoding.h:119:31: 
> error: explicitly defaulted function 'constexpr 
> PacBio::Data::detail::NCBI2na& 
> PacBio::Data::detail::NCBI2na::operator=(const 
> PacBio::Data::detail::NCBI2na&)' cannot be declared as constexpr 
> because the implicit declaration is not constexpr: 
>  inline constexpr NCBI2na& operator=(const NCBI2na&) = default; 

la partie du code qui causent problème est:

class NCBI2na 
{ 
public: 
    static inline constexpr NCBI2na FromASCII(const char base) { return NCBI2na{base}; } 
    static inline constexpr NCBI2na FromRaw(const uint8_t raw) { return NCBI2na{raw}; } 

public: 
    ~NCBI2na() = default; 

    inline constexpr NCBI2na(const NCBI2na&) = default; 
    inline constexpr NCBI2na(NCBI2na&&) = default; 

    inline constexpr NCBI2na& operator=(const NCBI2na&) = default; 
    inline constexpr NCBI2na& operator=(NCBI2na&&) = default;  
}; 

la partie du code qui semble cause des problèmes est le « = défaut ». Cela peut aussi être lié

J'ai regardé autour mais n'ai pas pu trouver une solution à ce problème jusqu'ici. Voici quelques questions similaires qui pourraient aider:

constexpr defining static data member of literal type that is declared const constructor of derived class cannot be constexpr if base class contains array member

+0

Il [fonctionne] (http://coliru.stacked-crooked.com/a/c32bbd2a1633014f) avec GCC 7.2.0 ainsi que Clang 3.8.0. – Darklighter

Répondre

1

Cela ressemble à un bug de GCC. Si l'on suppose la compilation en C++ 14, puis les règles écrites sont celles-ci:

[dcl.constexpr]/3

The definition of a constexpr function shall satisfy the following constraints:

  • it shall not be virtual
  • its return type shall be a literal type;
  • each of its parameter types shall be a literal type;
  • its function-body shall be = delete, = default, or ...

Toutes ci-dessus sont en fait satisfaits dans le code que vous nous avez montré. La définition de votre opérateur d'affectation est donc correcte et doit être acceptée en tant que constexpr.


Ce code (une fois l'erreur induisant des fonctions statiques sont mis en commentaire), est acceptée par GCC 5.4.0. Donc, vous pouvez certainement craie jusqu'à un bug du compilateur.

+0

donc vous pensez que la compilation avec GCC 5.4.0 devrait fonctionner? –

+1

@ThomasCokelaer - Le lien dans mon addenum est à un compilateur en ligne qui fait exactement cela. – StoryTeller

+0

brillant. J'avais raté le lien. Et je peux reproduire l'erreur en utilisant le GCC 5.3.0. –