在 std 命名空间中定义的好友类:有任何保证吗?

2024-03-17

我回答的时候就出现了这个问题这个问题 https://stackoverflow.com/questions/15193108/c-unique-ptr-versus-friend-class-private-destructor/15193179:标准是否允许并做出任何保证friend- 标准库类和/或函数?

在这种特殊情况下,问题是:

class MyUserDefinedType
{
    friend struct std::default_delete<MyUserDefinedType>;

private:
    ~MyUserDefinedType() { }
}

保证允许MyUserDefinedType要存储在std::unique_ptr<MyUserDefinedType> or std::shared_ptr<MyUserDefinedType>具有默认删除器的对象。

一般来说,标准库中描述的类是否需要直接实现其功能,或者它们是否可以使用任意级别的间接?例如,是否有可能

  • std::default_delete<MyUserDefinedType>实际上是一个using内部命名空间中定义的类的别名std,在这种情况下friend声明将是非法的

or

  • std::default_delete<MyUserDefinedType>调用其他一些实际执行删除操作的类,在这种情况下friend声明不会达到预期的效果

或者其他类似的东西?

My guess is that this is UB not guaranteed to work but I am curious if this is addressed specifically by the standard.

上面给出的这个具体示例适用于 clang trunk (w/libc++) 和 GCC 4.7.2 (w/libstdc++),FWIW


有没有可能std::default_delete<MyUserDefinedType>实际上是在 std 的内部命名空间中定义的类的 using 别名,在这种情况下,友元声明将是非法的?

No。根据 C++11 标准第 20.7.1.1.2 段:

namespace std {
    template <class T> struct default_delete {
        constexpr default_delete() noexcept = default;
        template <class U> default_delete(const default_delete<U>&) noexcept;
        void operator()(T*) const;
    };
}

事实上它必须是一个类模板是明确指定的。这意味着它不能是别名模板。如果真是这样的话,那也不可能专精。

有没有可能std::default_delete<MyUserDefinedType>调用实际执行删除操作的其他类,在这种情况下,友元声明不会达到预期的效果?

Yes.标准中没有任何内容指定该调用不能由某些内部帮助程序完成。根据第 20.1.1.2 段:

void operator()(T *ptr) const;

3 效果:调用delete on ptr.

4 备注:如果T是不完整类型,程序格式错误。

这仅指定了effect调用呼叫操作员default_delete<>函子应该是,而不是how这应该具体实现(无论是直接在调用运算符的体内,还是通过将任务委托给其他类的某个成员函数)。

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

在 std 命名空间中定义的好友类:有任何保证吗? 的相关文章

  • 调用许多网络服务的最佳方式?

    我有 30 家子公司 每家都实施了他们的 Web 服务 使用不同的技术 我需要实现一个Web服务来聚合它们 例如 所有子公司的Web服务都有一个名为的Web方法GetUserPoint int nationalCode 我需要实现我的网络服
  • 当从后台工作程序发生事件时,XlCall.Excel(XlCall.xlcCalculateNow) 抛出 XlCallException

    我有一个 ExcelFunction 来排队一些计算 ExcelFunction public static void QueueCalcs takes ranges var calcRequests builds list of calc
  • Nullable 是不可能的,为什么不呢? [复制]

    这个问题在这里已经有答案了 如果这是一个愚蠢的问题 请原谅 我正在尝试更好地理解 Net 中的 Nullable 类型 从我从 Microsoft 源代码 使用 ReSharper 中注意到的内容 我了解到 Nullable 是一个结构 而
  • EventHandler 应该始终用于事件吗?

    我一直在愉快地使用自定义委托类型和通用编写事件Action委托类型 没有真正考虑我在做什么 我有一些很好的扩展助手Action and EventHandler这使我倾向于使用那些预定义的委托类型而不是我自己的委托类型 但除此之外 除了惯例
  • 通过 SOAP 的 Gmt php 或 UTC C# 等效项

    is C DateTime UtcNow和 PHPdate c 是等价的 我怀疑 因为当我肥皂时 我得到了 C
  • C++中的类要具备什么条件才能成为容器?

    我是 C 编程新手 偶然发现了这个术语containers举例如下vector deque map etc 一个企业的最低要求应该是什么class应该满足被称为container in C 我将从 范围 这个概念开始 Range 只有两个方
  • PrivateObject 找不到属性

    我的结构基本上如下所示 abstract class A protected string Identificator get set private void DoSomething DoSomethingSpecific protect
  • 检测 TextBox 中的 Tab 键按下

    I am trying to detect the Tab key press in a TextBox I know that the Tab key does not trigger the KeyDown KeyUp or the K
  • “没有合适的默认构造函数可用”——为什么会调用默认构造函数?

    我已经查看了与此相关的其他一些问题 但我不明白为什么在我的情况下甚至应该调用默认构造函数 我可以只提供一个默认构造函数 但我想了解它为什么这样做以及它会产生什么影响 error C2512 CubeGeometry no appropria
  • 如何在新窗口中打开图像或pdf文件?

    我有一个 gridview 它包含文件名和文件路径 图像和 pdf 格式文件 其中我使用了模板字段 在该字段下放置了 1 个图像按钮 单击该图像按钮 即 查看 按钮 时 我想在新窗口中打开所选文件 这是我的代码 protected void
  • MSChart 控件中的自定义 X/Y 网格线

    我有一个带有简单 2D 折线图的 C Windows 窗体 我想向其中添加自定义 X 或 Y 轴标记 并绘制自定义网格线 例如 以突出显示的颜色 虚线 我查看了 customLabels 属性 但这似乎覆盖了我仍然想显示的默认网格 这是为了
  • C 与 C++ 中的 JNI 调用不同?

    所以我有以下使用 Java 本机接口的 C 代码 但是我想将其转换为 C 但不知道如何转换 include
  • 在 mvc4 中创建通用 mvc 视图

    我以前也提过类似的问题 没有得到答案 如何创建一个通用的 mvc4 视图 该视图可以显示传递给它的模型列表或单个模型 模型可以是个人 组织或团体 无论传递给它的是什么 如果您正在寻找类似的东西 model MyViewModel
  • WPF DataGrid - 在每行末尾添加按钮

    我想在数据网格的每一行的末尾添加一个按钮 我找到了以下 xaml 但它将按钮添加到开头 有人知道如何在所有数据绑定列之后添加它吗 这会将按钮添加到开头而不是末尾
  • 使用 Unity 在 C# 中发送 http 请求

    如何使用 Unity 在 C 中发送 HTTP GET 和 POST 请求 我想要的是 在post请求中发送json数据 我使用Unity序列化器 所以不需要 新的 我只想在发布数据中传递一个字符串并且能够 将 ContentType 设置
  • 如何测试某些代码在 C++ 中无法编译? [复制]

    这个问题在这里已经有答案了 可能的重复 单元测试编译时错误 https stackoverflow com questions 605915 unit test compile time error 我想知道是否可以编写一种单元测试来验证给
  • 与 Entity Framework Core 2.0 的一对零关系

    我正在使用 C 和 NET Framework 4 7 将 Entity Framework 6 1 3 Code First 库迁移到 Entity Framework Core 我一直在用 Google 搜索 Entity Framew
  • 当 Verb="runas" 时设置 ProcessStartInfo.EnvironmentVariables

    我正在开发一个 C 应用程序 我需要创建变量并将其传递给新进程 我正在使用ProcessStartInfo EnvironmentVariables 新进程必须提升运行 因此我使用 Verb runas var startInfo new
  • 使用 IdentityDbContext 和 Code First 自动迁移表位置和架构的实体框架?

    我正在尝试使用 IdentityDbContext 类设置自动迁移更新 并将更改传播到整个数据库的实际 DbContext 在进入代码之前 在使用自动迁移实现 IdentityDbContext 时 我收到此错误 影响迁移历史系统表位置的自
  • IDisposable 的显式实现

    虽然有很多关于IDisposable在 SO 上找到 我还没有找到答案 我通常遵循这样的做法 当我的一个班级拥有一个IDisposable对象然后它也实现IDisposable并打电话Dispose在拥有的对象上 然而最近我遇到了一个类 它

随机推荐

  • 保护字符串缓冲区免受两个线程的影响?

    我正在通过 Indy 套接字处理流数据包字符串 在客户端 我有一个线程从TIdTCPClient并将这些数据连续附加到单个字符串缓冲区的末尾 我有另一个线程从头开始连续读取该缓冲区 根据需要复制 和删除 数据 一次一个完整的数据包 我知道在
  • 使用时间戳计数器获取时间戳

    我使用下面的代码来获取处理器的时钟周期 unsigned long long rdtsc void unsigned hi lo asm volatile rdtsc a lo d hi return unsigned long long
  • 对于委托接口,Kotlin IllegalAccessError 带有 += 和 -=

    我定义了这个类 class NeverNullMap
  • 如何在偏好更改时重新安排警报管理器

    我有一个 Android 服务 当手机启动时 广播接收器会收到通知 并安排服务以 X 分钟的间隔重复运行 从此以后 每隔 X 分钟 另一个广播接收器就会收到这些通知并启动该服务 该服务完成其工作并退出 到目前为止 一切都很好 现在我希望这
  • $scope.myVariable 未在 Angular-ui 引导模式的控制器中更新

    在我看来 我有一个输入 一个跨度和一个按钮 如下所示 当在文本框中输入内容时 span按预期阅读更新 但当点击按钮时 phoneNumber控制器内部尚未更新 app controller myPopopCtrl scope modalIn
  • 如何将当前行作为 Vim EX 命令执行?

    假设我正在编辑我的 vimrc文件 我刚刚添加了几行 例如一个新的键映射 我不想重新加载whole file so 因为这会重置我正在尝试的许多临时内容 我只想运行我当前正在处理的两条线 我没有运气尝试将这些行复制 粘贴到命令缓冲区中 因为
  • CPU 和数据对齐

    如果您觉得这个问题已经被回答了很多次 请原谅我 但我需要以下问题的答案 为什么数据必须对齐 在 2 字节 4 字节 8 字节边界上 这里我的疑问是 当CPU有地址线Ax Ax 1 Ax 2 A2 A1 A0时 很有可能按顺序寻址内存位置 那
  • 循环枚举、TypeScript 和 JQuery

    你好 我正在尝试使用 TypeScript 和 JQuery 开发一个简单的待办事项应用程序 我有一个列出任务类型的枚举 export enum TaskType FrontEnd BackEnd Designer 然而 使用 jquery
  • 字符串池:“Te”+“st”比“Test”快?

    我正在尝试一些有关字符串池的性能基准 然而 结果并不令人期待 我做了3个静态方法 Perform0 方法 每次都会创建一个新对象 Perform1 方法 字符串文字 Test Perform2 方法 字符串常量表达式 Te st 我的期望是
  • 如何使用 PyYAML 创建当前本地日期和时间

    我希望能够创建一个日期时间对象datetime datetime now PyYAML 调用一些函数很容易 gt gt gt y YAML description Something ts python object apply time
  • iOS 如何从 UISlider 中删除发光/阴影

    如何去除此 UISlider 中的发光 阴影 事实证明 我所需要做的就是设置一个自定义拇指图像 并且阴影不存在
  • 重载 istream 运算符>> C++

    假设我有一个字符向量 我将它作为字符串而不是字符向量推入流中 我如何使用运算符 gt gt 取回字符向量 class C private vector
  • 在 Rails 中提供静态 JSON 对象文件

    如何从 Rails 中的文件提供静态 JSON 对象 我想在ajax调用中访问它 最好的方法是什么 只需将要渲染的内容放入变量中 然后使用render json gt variable列表 字典等都有合理的默认值 看看这个 http gui
  • Spring 相当于 Guice 中的 FactoryModuleBuilder、@AssistedInject 和 @Assisted 的什么?

    是什么Spring框架 http projects spring io spring framework 相当于FactoryModuleBuilder http google github io guice api docs latest
  • Sql Server 死锁对象 ID 太大

    我试图追踪 SQL 2005 数据库 64 位 中发生的死锁 我们目前没有启用快照隔离 我打开 tf 1204 并收到以下输出 从这个输出中 我可以确定节点 1 是一个存储过程 它选择数据并且仅修改 temp 表中的值 节点 2 是另一个存
  • 在运行时更改标记图标

    有没有办法在运行时更改 Google Maps Android API v2 标记的图标 而无需删除 重新添加我想要更改其图标的标记 我可以对其应用变换 如旋转 吗 Thanks 更新后 我可以在运行时轻松更改标记图标Google Play
  • 如何使 TensorFlow 在具有 2.x 功能的 GPU 上运行?

    我已在 Linux Ubuntu 16 04 上成功安装了tensorflow GPU 并进行了一些小的更改 以使其能够与新的 Ubuntu LTS 版本配合使用 然而 我认为 谁知道为什么 我的 GPU 满足计算能力大于 3 5 的最低要
  • Grails 2.4.2 - 动态引用默认数据源

    这个问题已经部分回答了here https stackoverflow com a 10537001 2315900但动态引用默认数据源仍然存在问题 我正在开发一个内部应用程序 它允许开发人员修改我们的多租户应用程序之一的配置设置 并将这些
  • 阻止 IP 地址访问 Heroku 上的 Flask 应用程序?

    我需要在我的网站上阻止一个 IP 地址 在 Heroku 上运行 Flask 应用程序 我看到我的服务器每秒有 50 个请求 这绝对不应该发生 我熟悉在 Apache 服务器上使用 htaccess 这里有类似的东西吗 Gunicorn 服
  • 在 std 命名空间中定义的好友类:有任何保证吗?

    我回答的时候就出现了这个问题这个问题 https stackoverflow com questions 15193108 c unique ptr versus friend class private destructor 151931