为什么不能在类声明中使用“is_base_of”(不完整类型)?

2024-01-07

我完全明白为什么会这样cannot work:

class Base {};
class A;
static_assert(std::is_base_of<Base, A>::value, "");

因为没有关于“类层次结构”的信息,但是...... 为什么以下不能工作?

class Base {};
class A : public Base {
    static_assert(std::is_base_of<Base, A>::value, "");
};
(produce: an undefined class is not allowed as an argument to compiler intrinsic type trait)

类型“A”仍然不完整,符合 static_assert (根据这个概念的定义)。然而,编译器已经知道“类层次结构”,并且可以为此提供答案。

当然 - 这个 static_assert 可以移动到析构函数或其他任何东西来解决这个问题,但在某些情况下无法做到这一点,例如:

class Base {};

template<typename T>
struct type_of {
    static_assert(std::is_base_of<Base, T>::value, "T is not derived from Base");
    using type = int; //* Some normal type in real use
};

class A : public Base {
public:
    type_of<A>::type foo(); // Will not compile
};

难道不应该被允许吗?


类定义已完成(即类被认为是已定义的) 在右大括号之后}.
在你的情况下,当你尝试使用A with std::is_base_of, A尚未完全定义:

class A : public Base {
    // no closing brace for A yet, thus A isn't fully defined here
    static_assert(std::is_base_of<Base, A>::value, "");
};

另一方面,std::is_base_of需要完全定义的类型才能工作。
因此出现错误。


作为解决方法,您可以将断言放在析构函数中A:

class A : public Base {
    ~A() {
        static_assert(std::is_base_of<Base, A>::value, "");
    }
};

事实上,类类型被认为是在其成员函数体内完全定义的。


See here http://eel.is/c++draft/class#mem-6有关更多详细信息(强调我的):

在类说明符的结尾 } 处,类被视为完全定义的对象类型 ([basic.types])(或完整类型)。在类成员规范中,类在函数体内被认为是完整的、默认参数、noexcept 说明符和默认成员初始值设定项(包括嵌套类中的此类内容)。否则,它在其自己的类成员规范中被视为不完整。

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

为什么不能在类声明中使用“is_base_of”(不完整类型)? 的相关文章

随机推荐

  • 为什么C++没有幂运算符? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • MYSQL 中的单个等于

    我想知道为什么 MYSQL 在条件语句中使用单个等号而不是更典型的两个等号 这有技术 历史原因吗 谢谢 你好 我想知道为什么 MYSQL 在条件语句中使用单个等号而不是更典型的两个等号 这有技术 历史原因吗 谢谢 比较更常见于SQL比作业
  • Cordova 文件传输:上传到 aws s3 后无法查看图像

    我正在使用 cordova 文件传输将图像上传到我的 s3 存储桶 我设法上传文件 没有任何错误 甚至在 s3 中作为文件可见 但是当我尝试从 s3 下载图像时 我无法查看它 图像已损坏 当做file image png我得到的结果是它是一
  • 根据子值合并数组中的对象

    我有一个填充有对象的数组 当对象具有匹配的特定子值时 如何合并此数组内的对象 我的数组如下所示 var data prod name test1 type 1 color white product id 5 prod name test2
  • Laravel date 不允许我使用 diffForHumans

    我的表设置了时间戳字段 用于在字段中创建和更新 在我的模型中 我这样做 protected dates created at updated at 但是当调用日期时 p gt created at gt diffForHumans I ge
  • TypeScript 泛型在柯里化时不适用于先前的函数,如何处理?

    我有一个咖喱版本map处理承诺 它需要两个参数 一次一个 它需要两个类型参数来让调用者提供无法推断的部分 然而 实际上 调用者总是必须提供它们 因为在它们传入的转换函数中不会推断类型 该函数如下所示 description Like ram
  • Celery工人挂起,没有任何错误

    我有一个用于运行 celery 工作人员的生产设置 用于向远程服务发出 POST GET 请求并存储结果 它每 15 分钟处理大约 20k 任务的负载 问题是工人们无缘无故地变得麻木 没有错误 没有警告 我也尝试过添加多处理 结果相同 在日
  • 通过 getRealPath() 将上传的文件写入磁盘时出现 java.io.FileNotFoundException

    Glassfish 似乎在我也想保存图像文件的路径中添加了额外的内容 是否有某种方法可以仅使用我的 servlet 获得的绝对路径 String appPath request getServletContext getRealPath 我
  • CouchDB 查询性能

    如果文档数量越多 CouchDB 中数据查询是否会变慢 示例场景 我有一个用于客户名称表单的组合框 当用户输入客户名称时 我必须进行自动填充 CouchDB 中将有大约 10k 个客户文档 我知道我必须创建一个视图才能执行相同的操作 Cou
  • DacPac 错误太大 - 但我的文件只有 406kb

    我正在尝试将我的数据库上传到 SQL Azure 我已创建 DCA 包并开始上传过程 但是 我立即收到以下错误 指定的 DacPac 太大 允许的最大 DacPac 大小为 5242880 字节 我不明白为什么上传文件为 406KB 时会出
  • iOS:删除 UINavigationBar 动画

    我们的应用程序有一个 UINavigationBar 上面有图像 当我们转到 推送 到另一个屏幕然后单击后退按钮时 导航栏上的图像在重新出现时似乎会从左到右进行动画处理 这有点让人分心 如何删除这个后退按钮动画 我们尝试更改 segue A
  • 抽屉导航在 Windows Phone 8.1 中有时无法工作[RT] [已关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我正在使用抽屉布局找到代码msdn https code msdn microsoft com windowsapps Windows
  • .NET Core 2.0 中 IServiceCollection 缺少扩展方法 AddJwtBearerAuthentication()

    我已使用以下说明将我的项目从 Core 1 1 更新到 Core 2 0https blogs msdn microsoft com webdev 2017 08 14 announcing asp net core 2 0 https b
  • 如何使用 AWS AppSync 进行无服务器开发?

    我有一个关于开发无服务器应用程序的一般性问题AWS 应用程序同步 https aws amazon com appsync 尤其 我们正在考虑为一个小项目采用无服务器 我想知道人们在创建 无服务器 应用程序时通常如何设置他们的开发环境 我已
  • 调整

    我有一个包含子菜单的菜单 它的 HTML 源代码如下所示 ul li a href Menu 1 a ul li a href Item 1 a a a li li a href Subitem 1 a ul li a href Subsu
  • 是否可以在 Typescript 中定义非空数组类型?

    我有一个数字列表 我知道这些数字永远不会为空 是否可以在 Typescript 中定义一个永远不为空的数组 我知道像这样的元组是可能的 number number 但这不起作用 因为我的数组可以是任何大小 我想我正在寻找的是NonEmpty
  • 无法计算 Vim 中的匹配数

    如何计算 Vim 中的匹配数 例如 对于文本
  • 谷歌大查询中行之间的差异

    我目前正在尝试计算谷歌大查询中行之间的差异 我实际上有一个有效的查询 SELECT id record time level lag level lag as diff FROM SELECT id record time level LA
  • Java 8 使用 Lambda 过滤数组

    我有一个double 我想在一行中过滤掉 创建一个没有的新数组 负值而不添加for循环 使用 Java 8 lambda 表达式可以实现这一点吗 在 python 中 使用生成器将是这样的 i for i in x if i gt 0 在
  • 为什么不能在类声明中使用“is_base_of”(不完整类型)?

    我完全明白为什么会这样cannot work class Base class A static assert std is base of