Constexpr 类:继承?

2024-01-27

首先,我正在使用 Clang 3.4.1

我正在编写一个全局变量,它必须充当编译时上下文的占位符(主要作为值模板参数)。为此,我编写了一个名为的 constexpr 类chameleon(它模仿任何运行时值的行为):

struct chameleon
{
    template<typename T>
    constexpr operator T() const
    {
        return T{};
    }

    constexpr chameleon() = default;
};

由于转换运算符和构造函数都指定为constexpr,我能够在编译时创建该类的实例。例如 https://ideone.com/KhAN6R:

template<int foo>
struct bar
{};

using mytype = bar<chameleon{}>;

由于这有效,并且我在其他地方使用它,所以我决定编写这样的占位符类型 只是继承自chameleon:

template<std::size_t I>
struct placeholder : public chameleon
{
    using chameleon::chameleon;
};

我使用的是 C++11,所以我只使用了“新”(C++11 已经三年了......)继承构造函数功能。

声明占位符变量时:

constexpr const placeholder<0> _1;

编译器拒绝该代码,称它需要用户定义的默认构造函数进行初始化。所以“嗯,继承 ctors 不会传播 constexpr 或类似的东西”是我的想法。然后我将 using 更改为默认的 ctor 声明:

template<std::size_t I>
struct placeholder : public chameleon
{
    constexpr placeholder() = default;
};

现在编译器说:

错误:const 类型“const placeholder”对象的默认初始化需要用户提供的默认构造函数

如果我改变= default到手动定义的空构造函数(constexpr placeholder() {})然后它可以工作,但构造函数不会被评估为constexpr以及使用_编译时上下文中的占位符无效(常见的is not a constant expression错误)。手动调用基本构造函数也是如此。

我的问题是:继承和继承有什么问题constexpr构造函数?写的时候有没有办法使用继承constexpr课程?

EDIT:我有一个被零除的错误,使用手动编写的 ctor 的代码工作得很好。另一方面,我不明白为什么继承构造函数或默认构造函数声明都不起作用。问题依然存在。


所以“嗯,继承 ctors 不会传播 constexpr 或类似的东西”就是我的想法

这不是问题所在;默认构造函数和复制/移动构造函数不能被继承。如果您没有显式定义或默认它们,它们将按照通常的规则隐式定义。

§12.9 [类.inhctor]

3      对于继承构造函数候选集中的每个非模板构造函数除了没有参数的构造函数或具有单个参数的复制/移动构造函数之外,除非存在具有相同构造函数特征的用户声明构造函数,否则隐式声明构造函数 完整类中的签名使用声明出现,或者构造函数将是该类的默认构造函数、复制构造函数或移动构造函数。 ...

5      [Note:默认构造函数和复制/移动构造函数可以按照 12.1 和 12.8 中的规定隐式声明。——尾注 ]

最后,placeholder,带或不带 using 继承声明chameleon的构造函数,将隐式定义一个默认构造函数,并且该构造函数将是constexpr.

§12.1/5 [类.ctor]

...如果用户编写的默认构造函数能够满足constexpr构造函数(7.1.5),隐式定义的默认构造函数是constexpr. ...

您的类具有用户提供的默认构造函数,满足 §7.1.5/4 中的要求constexpr构造函数。您看到的错误是由于下一部分造成的。


至于为什么必须为 a 提供构造函数定义const对象,让我们看一下您的班级。

struct chameleon
{
    template<typename T>
    constexpr operator T() const
    {
        return T{};
    }

    constexpr chameleon() = default;
};

这个类既简单(9/6)又标准布局(9/7),因此它是一个 POD(9/10)。 POD 默认情况下未初始化,因此const没有初始化程序的 POD 将是未初始化的且不可变的,这使得它几乎毫无价值(或者至少我无法想到任何用例)。

通过提供默认构造函数,该类不再是 POD,并且将被默认初始化。

正如 @Casey 在 中指出的comments https://stackoverflow.com/questions/24333458/constexpr-class-inheritance#comment37616985_24333884,此要求列于§8.5/7

如果程序调用 const 限定类型的对象的默认初始化T, T应是具有用户提供的默认构造函数的类类型。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Constexpr 类:继承? 的相关文章

随机推荐

  • Apache ITK 与 Suexec

    使用有什么好处ITK模块而不是Suexec运行 Apache 服务器 想法是一样的 都是以所有者权限运行脚本 而不是nobody www or apache 是不是比较好用ITK有利于suexec 如果是这样 为什么 相比之下 安全性和性能
  • 不兼容,因为该组件声明了一个与 Java 11 兼容的组件,而使用者需要一个与 Java 10 兼容的组件

    在我的 build gradle 文件中 我升级了一个依赖项的版本 即 com db microservice commons 加载 gradle 更改后 我收到以下错误消息 gt Build file C Projects Contain
  • 我应该如何在 php 中使用 dom 获取这样的 div 内容?

    div是这样的 div style width 90 margin 0 auto color Black this is text severaltags div 我应该如何获取 div 的内容 包括在php中使用dom标签 假设你使用 P
  • 始终显示 ChartJS 自定义工具提示

    在遵循了这里和官方文档中的几个指南之后 我完全陷入困境 我有一些自定义工具提示 它们将根据自定义工具提示中的数据名称在其中显示 PNG 图形 我找到了几种隐藏工具提示的解决方案 或者将它们全部设置为始终显示 但它们似乎都没有按照我想要的方式
  • Android 中的 Firebase 实时数据库 setValue 不起作用

    我第一次尝试使用实时数据库 设置值功能对我不起作用 我已经通过以下方式更新了写作规则 rules read true write true 我的代码如下所示 Integer Age 24 FirebaseDatabase mDatabase
  • 在 C# 中缓冲字节数据

    我的应用程序从 TCP 套接字读取字节并需要缓冲它们 以便我稍后可以从中提取消息 由于 TCP 的性质 我可能会在一次读取中获得部分或多个消息 因此每次读取后我想检查缓冲区并提取尽可能多的可用完整消息 因此 我想要一个允许我执行以下操作的类
  • User.Identity.GetUserId() 方法在 Web Api 2 控制器中不起作用

    在常规控制器中 以下代码有效 HttpPost public ActionResult Custom string name User Identity GetUserName string id User Identity GetUser
  • 如何通过 for 循环从 C 函数返回表的表到 Lua

    我有一个std list对象 我想给 Lua 一个返回其多维位置的函数 所以我需要创建一个表的表 1 2 3 512 1 2 3 512 512 lua newtable L for int i 0 i lt 512 i lua newta
  • C 中的 HTTP 堆栈

    有没有用C实现的HTTP协议栈 提前致谢 更新 寻找客户端实现 你没有说你是在寻找客户端还是服务器 但很快谷歌就出现了libmicrohttpd http www gnu org software libmicrohttpd 用于在您的应用
  • 如何使用 Google 云端硬盘 API 密钥从 Android 应用程序访问云端硬盘内容?

    我无法访问 Google 云端硬盘 我在 Google API 控制台中创建了一个 API KEY 并启用了 Google Drive API 和 SDK 我在代码中的哪里设置 API KEY 驱动器生成器没有setJsonHttpRequ
  • cassandra中的主键是唯一的吗?

    这可能有点蹩脚 但在 cassandra 中主键是唯一的吗 例如下表中 CREATE TABLE users name text surname text age int adress text PRIMARY KEY name surna
  • .Net core 中 Json() 的小写属性名称

    有类 ClientViewModel public class Result public long PKID get set public string Name get set 并有 post 方法返回此模型 HttpPost publ
  • 如何让一个函数每 10 分钟在服务中运行一次?

    我有一个正在运行的 Windows 服务 在其中我想每隔几分钟运行一个函数 我找到了一些代码 但它似乎不起作用 我有一个记录器 它似乎没有进入过timer Elapsed 函数 protected override void OnStart
  • 阻止加载混合活动内容

    我在控制台中收到这些警告 但我的脚本无法正常工作 阻止加载混合活动内容 http code jquery com ui 1 10 3 themes smoothness jquery ui css http code jquery com
  • 如何获取 Flutter App 的编译/构建日期?

    我知道如何使用获取版本包信息 https pub dartlang org packages package info 但是如何在 ios 和 android 上获取运行时的构建时间戳 您可以使用构建 shell 脚本来创建 更新 Dart
  • 从 SetUpFixture 将参数传递给 TestFixture OneTimeSetUp

    我目前正在使用 C 构建一个自动化项目 nunit和 Selenium 我试图有一个安装类 它将在任何之前初始化 selenium webdriverTestFixture将运行并在所有这些都结束后尝试从TestFixture每一个Test
  • 无法理解 freeCodeCamp 中的 JS 递归倒计时函数

    所以 我已经明白了ideaJavaScript 中的递归 有一个功能是loops itself直到达到base条件 此时它停止并且返回最终结果 但是当我将其应用于尝试将其应用于的实际语法时 我有点头疼创建数组 让我们使用freeCodeCa
  • 更改 ApacheDS 中的默认管理员密码

    我是 ApacheDS 新手 我正在使用 apacheds 2 0 0 M17 管理员的默认密码是秘密的 有谁知道我可以在哪里将值更改为其他值 Inside apacheds instances default conf config ld
  • 找不到为 MVC 5 DropDownListFor 添加占位符的方法

    我尝试在网络上搜索并用我的代码尝试不同的东西 我知道如何为文本框添加占位符 但是为 MVC 5 下拉列表添加一个占位符怎么样 我有以下代码 但不会将占位符放入下拉列表中 Html DropDownListFor model gt model
  • Constexpr 类:继承?

    首先 我正在使用 Clang 3 4 1 我正在编写一个全局变量 它必须充当编译时上下文的占位符 主要作为值模板参数 为此 我编写了一个名为的 constexpr 类chameleon 它模仿任何运行时值的行为 struct chamele