显式默认函数不能声明为constexpr,因为隐式声明不是constexpr

时间:2017-10-15 14:45:27

标签: c++ constexpr

我正在尝试编译一个C ++库(使用gcc 5.3.1-14ubuntu2)并遇到这种类型的错误:

> 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;

导致问题的代码部分是:

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;    
};

似乎导致问题的代码部分是“= default”。这也可能是相关的

我环顾四周但到目前为止找不到解决这个问题的方法。 以下是一些可能有所帮助的类似问题:

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

1 个答案:

答案 0 :(得分:1)

这似乎是一个GCC错误。假设您编译为C ++ 14,那么编写的规则就是:

[dcl.constexpr]/3

  

constexpr函数的定义应满足以下条件   约束:

     
      
  • 它不应该是虚拟的
  •   
  • 其返回类型应为文字类型;
  •   
  • 每个参数类型都应为文字类型;
  •   
  • 其功能体应为= delete,= default或...
  •   

以上所有内容实际上都符合您向我们展示的代码。因此,您的赋值运算符定义是可以的,应该被接受为constexpr

GCC 5.4.0接受此代码(一旦错误诱导静态函数被注释掉)。所以你绝对可以将它归结为编译器错误。