首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >显式默认函数不能声明为constexpr,因为隐式声明不是constexpr。

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

Stack Overflow用户
提问于 2017-10-15 14:45:27
回答 1查看 2.6K关注 0票数 2

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

代码语言:javascript
运行
复制
> 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;

代码中引起麻烦的部分是:

代码语言:javascript
运行
复制
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“。这也可能是相关的

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

定义声明为const的文本类型的静态数据成员。 如果基类包含数组成员,则派生类的构造函数不能是constexpr。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-10-15 16:18:47

这好像是GCC的窃听器。假设编译为C++14,那么编写的规则如下:

[dcl.constexpr]/3

常设委员会职能的定义应满足下列限制:

  • 它不应该是虚拟的
  • 其返回类型应为文字类型;
  • 每种参数类型都应是文字类型;
  • 其功能主体应为=删除,=默认,或.

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

这段代码(一旦错误导致的静态函数被注释掉)将被GCC 5.4.0接受。所以你绝对可以把它归因于编译器的错误。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46756288

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档