c++ static_assert 在“if constexpr 语句”的两个分支上均失败

2023-12-02

我试图在编译时确定特定类型是否属于类型标准::对。 当我编译下面的代码时,两个分支(即“HERE1”和“HERE2”)上的断言均失败。 如果我删除 static_asserts 并取消注释打印,我会得到我所期望的: 这是“HERE1”的is_pair_type<:value_type>,以及“HERE2”is_pair_type.

我想这意味着编译器无法在编译时评估表达式,但我不明白为什么。

使用:MS VS2019,MSVC 版本 14.29.30037

Thanks.


template< class T >             struct is_pair : std::false_type {};
template< class T1, class T2 >  struct is_pair< std::pair< T1, T2 > > : std::true_type {};
template< class T >             struct is_pair_d : is_pair<typename std::decay<T>::type> {};
// a helper function for value
template<class T> struct is_pair_type {
    static constexpr bool const value = is_pair_d<T>::value;
};

int main()
{
    using T = std::map<int, float>;
    T blabla;

    if constexpr (is_pair_type<T>::value)
    {
        //std::cout << "HERE1" << "\n";
        static_assert(false, "HERE1");
    }
    else
    {
        //std::cout << "HERE2" << "\n";
        static_assert(false, "HERE2");
    }
    ...

构造函数 if应该与模板一起使用:

在模板之外,会全面检查已丢弃的语句。if constexpr不能替代 #if 预处理指令:

void f() {
    if constexpr(false) {
        int i = 0;
        int *p = i; // Error even though in discarded statement
    }
}

And

注意:对于每个可能的专业化,被丢弃的语句不能是格式错误的:

template <typename T>
void f() {
     if constexpr (std::is_arithmetic_v<T>)
         // ...
     else
       static_assert(false, "Must be arithmetic"); // ill-formed: invalid for every T
}

您可以将代码包装到函数模板中,例如:

template<class T> struct dependent_false : std::false_type {};
template <typename T>
void foo() {
    if constexpr (is_pair_type<T>::value)
    {
        std::cout << "HERE1" << "\n";
        static_assert(dependent_false<T>::value, "HERE1");
    }
    else
    {
        std::cout << "HERE2" << "\n";
        static_assert(dependent_false<T>::value, "HERE2");
    }
}

Then

using T = std::map<int, float>;
foo<T>(); // static_assert fails only on the else part

LIVE

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

c++ static_assert 在“if constexpr 语句”的两个分支上均失败 的相关文章

随机推荐

  • 在 R 中:获取第一个标点符号之前的所有数字字符

    我有一个向量s字符串 或 NA 并且希望在第一次出现标点符号之前获得一个长度相同的向量 s lt c ABC1 2 22A 2 NA 我想要这样的结果 1 ABC1 22A NA 您可以使用以下类似 Perl 的正则表达式从第一个点删除所有
  • Webview保存页面状态

    我正在使用的网络视图有一个小问题 我正在尝试使用网络视图来允许用户填写注册表 当用户在一个会话中完成表单时 这种方法效果很好 但如果用户锁定手机 则 webview 活动将被破坏 我的记忆中有两项活动 其中一项是内存密集型的 我认为我遇到的
  • 从字符串 "" 到 long 的转换无效

    即使经过大约一个小时的研究 我也遇到了无法解决的错误 从字符串 Waseem PC Waseem 到 long 的转换无效 这个错误真的很烦人 我尝试了一切 我非常感谢您的帮助 我很想对你的答案竖起大拇指 但我必须有更大的代表 这是我的代码
  • 在网络视图中从相机上传图像不起作用

    我一直在尝试从 facebook 通过 webview 从画廊和相机上传 Workplace 中的图像 从图库中它工作正常 但从相机中图像不会出现在上传中 我看过类似的帖子有这个问题this and this但我不明白有什么问题 这是我的课
  • Windows Media Foundation 枚举相机设备

    I would like to enumerate the camera devices on my computer using Windows Media Foundation I used the code on Microsoft
  • 我可以取消引用整数指针的地址吗?

    考虑到以下给定 我试图找出填充 int 指针 k 的所有可能方法 int i 40 int p i int k 到目前为止我想出了 i 和 p 但是 是否可以用 p 或 p 来填空呢 我对 p 的理解是它取消引用整数指针的地址 对我来说这意
  • 如何在Struts 2中通过id而不是属性从JSP获取数据到Action类?

    我正在Java Struts 2框架上做 通常 我可以通过 get set 方法从我的 JSP 中获取数据Form java 动作类 下面是我的例子 In main jsp file
  • npm 安装错误:“主机密钥验证失败。”

    我想从 Bitbucket 获取该模块 我在 Windows 服务器上构建了该模块 但是当我使用时出现错误npm install npm ERR Error while executing npm ERR C Users AppData L
  • 如何在访问期间知道ANTLR解析器当前处于哪个替代规则

    如果我们查看 bash 源代码 特别是 yacc 语法 我们可以看到所有重定向都是这样定义的 redirection GREATER WORD LESS WORD NUMBER GREATER WORD NUMBER LESS WORD R
  • 如何让 date_part 查询命中索引?

    我还没有能够让这个查询命中索引而不是执行完整扫描 我有另一个查询 它对几乎相同的表使用 date part day datelocal 该表的数据稍微少一些 但是相同的结构 并且将命中我在 datelocal 列上创建的索引 这是一个没有时
  • C# - 如何使用 TaskSchedular 类列出特定用户的计划任务

    我想知道是否有人可以帮助我 我正在尝试使用 TaskScheduler 类 http www codeproject com KB cs tsnewlib aspx 列出本地计算机上特定用户 管理员 的计划任务我有以下内容 richText
  • 剪一段阿拉伯字符串

    我有一个阿拉伯语字符串 例如 现在我需要剪切这个字符串并输出它 如下所示 我尝试了这个功能 function short name str limit if limit lt 3 limit 3 if strlen str gt limit
  • 从 codecommit 获取私人仓库

    我是 golang 新手 我们正在尝试在 go 中创建一个包并在我们想要使用的所有服务中使用 我尝试在 github 中创建一个存储库并尝试执行 go get 我没有遇到任何问题 现在我想在亚马逊的codecommit中创建相同的包 我将
  • WPF Listview:列重新排序事件?

    当用户更改顺序时 我需要同步两个 ListViews 事件的列顺序 但似乎没有列重新排序事件 目前我只是做了一个AllowsColumnReorder False 但这不是一个永久的解决方案 在网上搜索时 发现很多人都有同样的问题 但没有解
  • 膨胀类 android.widget.ImageButton 时出错

    当我在 系统 应用程序 上安装程序时出现错误 当我使用 数据 应用程序 时 它运行良好 这是错误 android view InflateException Binary XML file line 19 Error inflating c
  • 检查 BIT 列时 LINQ 生成奇怪的 SQL

    我有以下 LINQtoSQL 语句 from t1 in table1 join t2 in table2 on t1 Id equals t2 OtherTableId where t2 BranchId branchId t1 IsPe
  • 在egrep中匹配As后跟相同数量的B

    假设我想匹配一个具有完全相同数量的字符 A 和 B 的模式 这样正好有 n 个 A 后跟 n 个 B 例如 可以匹配以下字符串 AB AABB AAABBB 另一方面 这些字符串无法匹配 BA AAABB AABBB ABAB 为了解决这个
  • SVN 提交未完成

    当我在 svn 中提交文件时 我经常遇到这样的情况 在传输完所有文件后 svn 将挂起 然后最终超时并出现错误svn E175012 Connection timed out 当我上传超过 20 个文件时 似乎会发生这种情况 我相信这是在所
  • C - 将字符串拆分为字符串数组

    我不完全确定如何在 C 中执行此操作 char curToken strtok string curToken ls l we will say I need a array of strings containing ls l and N
  • c++ static_assert 在“if constexpr 语句”的两个分支上均失败

    我试图在编译时确定特定类型是否属于类型标准 对 当我编译下面的代码时 两个分支 即 HERE1 和 HERE2 上的断言均失败 如果我删除 static asserts 并取消注释打印 我会得到我所期望的 这是 HERE1 的is pair