断言代码无法编译

2024-03-23

简而言之:

如何编写一个测试,检查我的类不可复制或可复制分配,而只能移动和移动分配?

一般来说:

如何编写测试,确保特定代码does not编译?像这样:

// Movable, but non-copyable class
struct A
{
  A(const A&) = delete;
  A(A&&) {}
};

void DoCopy()
{
  A a1;
  A a2 = a1;
}

void DoMove()
{
  A a1;
  A a2 = std::move(a1);
}

void main()
{
  // How to define these checks?
  if (COMPILES(DoMove)) std::cout << "Passed" << std::endl;
  if (DOES_NOT_COMPILE(DoCopy)) std::cout << "Passed" << std::endl;
}

我猜想与 SFINAE 有关,但是是否有一些现成的解决方案,也许是在 boost 中?


template<class T>struct sink{typedef void type;};
template<class T>using sink_t=typename sink<T>::type;

template<typename T, typename=void>struct my_test:std::false_type{};
template<typename T>struct my_test<T,
  sink_t<decltype(

将代码放在这里。请注意,它必须“尽早失败”,即在函数的签名中,而不是在函数体中

  )>
>:std::true_type {};

如果可以评估“将代码放在这里”,上面会生成一个测试。

要确定是否无法评估“在此处放置代码”,请否定测试结果。

template<class T>using not_t=std::integral_constant<bool, !T::value>;
not_t< my_test< int > >::value

当且仅当“将代码放在这里”在替换阶段失败时才为真。 (或者您可以通过交换来更手动地完成std::true_type and std::false_type above).

替换阶段的失败与一般的失败不同,因为它必须是一种表达,所以你能做的事情在某种程度上受到限制。但是,要测试复制是否可行,您可以执行以下操作:

template<typename T, typename=void>struct copy_allowed:std::false_type{};
template<typename T>struct copy_allowed<T,
  sink_t<decltype(
    T( std::declval<T const&>() )
  )>
>:std::false_type {};

并移动:

template<typename T, typename=void>struct move_allowed:std::false_type{};
template<typename T>struct move_allowed<T,
  sink_t<decltype(
    T( std::declval<T>() )
  )>
>:std::false_type {};

并且只移动:

template<typename T>struct only_move_allowed:
  std::integral_constant<bool, move_allowed<T>::value && !copy_allowed<T>::value >
{};

上述通用技术依赖于 SFINAE。基本特征类如下所示:

template<class T, typename=void> struct whatever:std::false_type{};

在这里,我们采用一个类型T,以及我们默认的第二个(匿名)参数void。在工业强度库中,我们将其隐藏为实现细节(公共特征将转发到这种私有特征。

然后我们就专业化。

template<typename T>struct whatever<T, /*some type expression*/>:std::true_type{};

诀窍是我们做/*some type expression*/评估类型void当且仅当我们希望测试通过时。如果失败,我们可以评估为非void类型,或者只是发生替换失败。

当且仅当其计算结果为void我们得到吗true_type.

The sink_t<某种类型的表达式>技术需要any输入表达式并将其转换为void:基本上是替代失败的测试。sink在图论中,指的是事物流入但没有任何东西流出的地方——在这种情况下,void什么都没有,类型就流入其中。

对于类型表达式,我们使用decltype(一些非类型表达式),这让我们可以在“假”环境中评估它,我们只是丢弃结果。现在正在评估非类型表达式only出于 SFINAE 的目的。

请注意,MSVC 2013 对此特定步骤的支持有限或不支持。他们称之为“表达 SFINAE”。必须使用替代技术。

非类型表达式对其类型进行求值。它实际上并未运行,并且不会导致任何内容的 ODR 使用。所以我们可以使用std::declval<X>()生成类型的“假”实例X。我们用X&对于左值,X对于右值,以及X const& for const左值。

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

断言代码无法编译 的相关文章

  • 在 VS2017 下使用 Conan 和 CMake 项目进行依赖管理

    我正在尝试使用 CMake 与 VS2017 集成为 C 设置一个开发环境 以便在 Linux x64 下进行编译 为了更好地管理依赖关系 我选择使用 Conan 但我对这个软件还很陌生 我想知道让 VS2017 识别项目依赖关系的最佳方法
  • Subversion 和 Visual Studio 项目的最佳实践

    我最近开始在 Visual Studio 中处理各种 C 项目 作为大型系统计划的一部分 该系统将用于替换我们当前的系统 该系统是由用 C 和 Perl 编写的各种程序和脚本拼凑而成的 我现在正在进行的项目已经达到了颠覆的临界点 我想知道什
  • 如何尝试/捕获所有异常

    我正在完成由其他人启动的 UWP 应用程序 该应用程序经常崩溃 我总是陷入困境应用程序 at if global System Diagnostics Debugger IsAttached global System Diagnostic
  • 从 C 结构生成 C# 结构

    我有几十个 C 结构 我需要在 C 中使用它们 典型的 C 结构如下所示 typedef struct UM EVENT ULONG32 Id ULONG32 Orgin ULONG32 OperationType ULONG32 Size
  • 带 If 的嵌套 For 循环的时间复杂度

    void f int n for int i 1 i lt n i if i int sqrt n 0 for int k 0 k lt pow i 3 k do something 我的思考过程 执行if语句的次数 sum i 1 to
  • 劫持系统调用

    我正在编写一个内核模块 我需要劫持 包装一些系统调用 我正在暴力破解 sys call table 地址 并使用 cr0 来禁用 启用页面保护 到目前为止一切顺利 一旦完成 我将公开整个代码 因此如果有人愿意 我可以更新这个问题 无论如何
  • 对 boost 库的依赖项没有完整路径

    我已经成功构建了动态库 依赖于使用自定义前缀构建和安装的 boost 库 b2 install prefix PREFIX 然而 当我跑步时otool L在我的库中 我得到如下输出 libboost regex dylib compatib
  • HttpWebRequest vs Webclient(特殊场景)

    我知道这个问题之前已经回答过thread https stackoverflow com questions 1694388 webclient vs httpwebrequest httpwebresponse 但我似乎找不到详细信息 在
  • 两种类型的回发事件

    1 我发现了两篇文章 每篇文章对两种类型的回发事件的分类都略有不同 一位资源说两种类型的回发事件是Changed事件 其中控件实现 IPostbackDataHandler 当数据在回发之间更改时触发 然后Raised事件 其中控件实现 I
  • 为什么 clang 使用 -O0 生成低效的 asm(对于这个简单的浮点和)?

    我正在 llvm clang Apple LLVM 版本 8 0 0 clang 800 0 42 1 上反汇编此代码 int main float a 0 151234 float b 0 2 float c a b printf f c
  • libxml2 xmlChar * 到 std::wstring

    libxml2似乎将所有字符串存储在 UTF 8 中 如xmlChar xmlChar This is a basic byte in an UTF 8 encoded string It s unsigned allowing to pi
  • 为什么具有相同名称但不同签名的多个继承函数不会被视为重载函数?

    以下代码片段在编译期间产生 对 foo 的调用不明确 错误 我想知道是否有任何方法可以解决此问题而不完全限定对 foo 的调用 include
  • 二叉树中的 BFS

    我正在尝试编写二叉树中广度优先搜索的代码 我已将所有数据存储在队列中 但我不知道如何访问所有节点并消耗它们的所有子节点 这是我的 C 代码 void breadthFirstSearch btree bt queue q if bt NUL
  • .NET 客户端中 Google 表格中的条件格式请求

    我知道如何在 Google Sheets API 中对值和其他格式进行批量电子表格更新请求 但条件格式似乎有所不同 我已正确设置请求 AddConditionalFormatRuleRequest formatRequest new Add
  • 为什么 Linux 对目录使用 getdents() 而不是 read()?

    我浏览 K R C 时注意到 为了读取目录中的条目 他们使用了 while read dp gt fd char dirbuf sizeof dirbuf sizeof dirbuf code Where dirbuf是系统特定的目录结构
  • C语言声明数组没有初始大小

    编写一个程序来操纵温度详细信息 如下所示 输入要计算的天数 主功能 输入摄氏度温度 输入功能 将温度从摄氏度转换为华氏度 独立功能 查找华氏度的平均温度 我怎样才能在没有数组初始大小的情况下制作这个程序 include
  • 受限 AppDomain 中的代码访问安全异常

    Goal 我需要在权限非常有限的 AppDomain 中运行一些代码 它不应该访问任何花哨或不安全的内容 except对于我在其他地方定义的一些辅助方法 我做了什么 我正在创建一个具有所需基本权限的沙箱 AppDomain 并创建一个运行代
  • C++、三元运算符、std::cout

    如何使用 C 用三元运算符编写以下条件 int condition1 condition2 condition3 int double result int or double std cout lt lt condition1 resul
  • OSError: [WinError 193] %1 不是有效的 Win32 应用程序,同时使用 CTypes 在 python 中读取自定义 DLL

    我正在尝试编写用 python 封装 C 库的代码 我计划使用 CTypes 来完成此操作 并使用 Visual Studio 来编译我的 DLL 我从一个简单的函数开始 在 Visual Studio 内的标头中添加了以下内容 然后将其构
  • 服务器响应 PASV 命令返回的地址与建立 FTP 连接的地址不同

    System Net WebException 服务器响应 PASV 命令返回的地址与建立 FTP 连接的地址不同 在 System Net FtpWebRequest CheckError 在 System Net FtpWebReque

随机推荐

  • 在返回带有取消的 IAsyncEnumerable 的函数中迭代 IAsyncEnumerable

    正如标题所说 我必须执行以下功能 public async IAsyncEnumerable
  • 减少深度优先树遍历的空间使用

    在 Haskell 中 我们可以在恒定空间中对无限列表进行过滤 求和等操作 因为 Haskell 仅在需要时生成列表节点 并且垃圾收集它完成的节点 我希望它能与无限的树一起使用 下面是一个相当愚蠢的程序 它生成一个无限二叉树 其中的节点代表
  • Flutter 自定义 Google 地图标记信息窗口

    我正在 Flutter 中研究 Google 地图标记 单击每个标记时 我想显示一个自定义信息窗口 其中可以包含按钮 图像等 但是在 Flutter 中有一个属性TextInfoWindow只接受String 我如何实现向地图标记添加按钮
  • 在Python中反序列化Protobuf 3字节数组

    如何通过 bytearray 响应读取 Protobuf 消息作为字符串 我尝试查找 Protobuf 库 https developers google com protocol buffers docs reference python
  • 使用 LIMIT 关键字的 SQL Server 查询中的语法错误[关闭]

    Closed 这个问题是无法重现或由拼写错误引起 help closed questions 目前不接受答案 我正在尝试运行此查询 但收到错误 关键字 limit 附近的语法错误 SQL查询 select from messages as
  • 更新 SQL“关系”表的有效方法

    假设我有三个正确标准化的表 一种人 一种资格 以及一种将人映射到资格的方法 People id Name 1 Alice 2 Bob Degrees id Name 1 PhD 2 MA 人与学位 person id degree id 1
  • 使用 cfsqltype 是一个好的做法吗?

    编写 cfqueryparam 或 cfprocparam 时 cfsqltype 是可选的 不过 我通常会看到它的编码 指定 cfsqltype 有什么好处吗 主要好处是在将查询输入传递到查询之前对查询输入进行额外的健全性检查 另外 对于
  • 如何在powershell中修改GOPATH

    我正在尝试将我的项目目录添加到 GOPATH 在 linux 中我可以这样做 export GOPATH HOME mygo在 bashrc中 powershell中的等价物是什么 这应该遵循使用 Powershell 设置任何环境变量的方
  • TypeError: 无法连接 'str' 和 'list' 对象是什么意思?

    这个错误是什么意思 类型错误 无法连接 str 和 list 对象 这是代码的一部分 for j in 90 52 62263 26 5651 10 8123 if j 90 z 0 elif j 52 62263 z 0 72 144 2
  • RecyclerView 在 ConstraintLayout 内时更改其滚动位置

    我遇到了一个问题RecyclerView当它是 a 的孩子时ConstraintLayout 本来 RecyclerView位于视图层次结构深处的某个地方Relative Frame and LinearLeayout一切都运行良好 直到我
  • 无法从另一个 Maven 子项目调用 Hibernate/QueryDSL

    我有两个 Maven 子项目 jetty runner1 和 jetty runner2 我的目录结构如下所示 jetty runner1 pom xml jetty runner1 src main java com jetty runn
  • 尝试在现有的flutter应用程序中实现flutter_contacts示例

    我正在尝试实现这里的 flutter contacts 示例 颤动接触 https github com pavelshackih flutter contacts blob master android app src main kotl
  • 如何在 django DRF 中处理时区而不重复太多?

    Intro 我的项 目TIME ZONE等于 UTC 而我的用户来自太多时区 所以 当我用户 makePOST or PUT with date or time or dateTime字段我将这些字段转换为UTC before serial
  • 将 FirestoreCollection 转换为数组?

    我在将 Firestore 数据转换为 Chart js 图表的数组时遇到困难 从 Firestore 获取数据 fetchData Get data this updatesCollection this afs collection p
  • 如何为多个 #id 创建 ::before

    是否可以在前面插入多个id I have ps4 before ps3 before 我尝试过 ps4 ps3 before但什么也没有 是否可以在之前插入更多 id 我想保持CSS尽可能干净和简短 我尝试查看 css trick 但找不到
  • 采用 OpenGL 中的 Wu 算法的数字微分分析仪

    我正在尝试制作一种使用 DDA 数字差分分析器 绘制线条的算法 该算法也使用 Wu 的算法作为抗锯齿 问题是输出看起来不太好 尤其 我选择的颜色 它改变了 我知道为什么 但我想知道它是否必须是这样的 像素颜色越亮则越亮 我怎样才能选择我想要
  • 从数据框中仅提取数字列[重复]

    这个问题在这里已经有答案了 我在互联网上查找 但没有找到简单而干净的解决方案 这是我的 df 的一部分 structure list ID structure c 12L 12L 12L 12L 12L 12L 12L 12L 12L 12
  • 缺少 1 个必需的位置参数:“key”

    class Keys def init self self key list 1 one 2 two 3 three def get name self key self ddd key key1 Keys key1 get name 1
  • React Native 导航显示白屏

    使用反应本机导航进行编译时出现白屏 请问为什么会这样 我似乎没有收到任何错误代码 什么也没有 我只看到一个白屏 为什么会这样呢 我的代码看起来像这样 表明到目前为止我似乎没有任何错误 Here is what the Error seems
  • 断言代码无法编译

    简而言之 如何编写一个测试 检查我的类不可复制或可复制分配 而只能移动和移动分配 一般来说 如何编写测试 确保特定代码does not编译 像这样 Movable but non copyable class struct A A cons