如果 constexpr 和 dependent false static_assert 格式不正确?

2023-12-09

A 相关问题提供了类型无关的示例false in a static_assert:

template<class T> void foo()
{
    if constexpr(false)
        static_assert(false);
}

但是,我更担心同样的事情是否适用于类型相关的false。以下是该标准的相关引用:

该计划是格式错误,无需诊断,如果无法为模板生成有效的专业化或模板中 constexpr if 语句的子语句并且模板未实例化。§ 13.7/8.1

这让我感到惊讶,因为我经常看到以下习语:

template<class T> void foo()
{
    if constexpr(cond)
        // ...
    else
        static_assert(!std::is_same_v<T, T>);
}

事实上,cppreference甚至提供了一个例子同一事物的:

template<class T> struct dependent_false : std::false_type {};
template<class T> void foo()
{
    if constexpr (cond)
        // ...
    else
        static_assert(dependent_false<T>::value);
}

据我了解,在这两种情况下,都无法为相关的专业化生成有效的专业化if constexpr子陈述,因此格式错误,无需诊断。我对么?


无法为相关的领域生成有效的专业化if constexpr子陈述

Well no.

如果您专业化,您可以拥有该分支的有效专业化dependent_false first:

template <> struct dependent_false<int> : std::true_type {};
///
foo<int>(); // <-- A valid specialization for the `else` branch is possible here

事实上,创建这样的专业化是可能的(即使你没有)static_assert(dependent_false<T>::value);结构良好。

另一方面,static_assert(!std::is_same_v<T, T>);是格式不正确的 NDR,因为专门的模板来自std::不允许。

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

如果 constexpr 和 dependent false static_assert 格式不正确? 的相关文章

  • WPF DataGrid 在行删除后失去焦点

    我正在使用 WPF DataGrid 通过键盘 删除 键进行行删除 但是 删除该行后 DataGrid 失去焦点 并且 DataGrid SelectedIndex 1 与WinForm datagrid相比 删除一行后 焦点自动转移到下一
  • static const 和 constexpr 变量有什么区别? [复制]

    这个问题在这里已经有答案了 我明白 一个constexpr variable可以在编译时使用 对于模板 或者例如 static assert 但如果我想在没有 constexpr 的情况下做到这一点 我可以static const 自从 C
  • 忽略控制器参数缺失导致的异常

    我有一个使用 MVC4 构建的面向互联网的网站 我偶尔会收到来自机器人或好奇的用户发送不完整 URL 请求的错误报告 例如 public class ProductController Controller HttpGet public v
  • 如何将组添加到多个内置功能区选项卡 (vsto)?

    这是 VS2010 Office 2010 加载项 我想要的只是添加一个按钮 或按钮组 到多个内置选项卡 例如 我的按钮应该在两个中都可用新邮件消息功能区 and in 新预约丝带 我尝试添加一个新选项卡 在视觉设计器中 但这似乎不起作用
  • 有关堆栈大小的警告消息

    I use Visual Studio 2010 with Code Analysis活性 在我的代码中 有一行在函数中分配一些内存 TCHAR someString 40000 代码分析抛出警告信息 警告 C6262 函数使用 40000
  • WTL 子窗口事件处理

    我正在开发窗口应用程序 因为我在左侧和右侧有 2 个子窗口 我想分别处理两个窗口的输入事件 如何实现 My code class EditorWindow public DxWindow public CSplitterWindow m v
  • 以编程方式解析和编辑 C++ 源文件

    我想以编程方式解析和编辑 C 源文件 我需要更改 添加代码的某些部分 即函数 类块等 中的代码 我也 最好 能够得到评论 我想做的部分事情可以用下面的代码来解释 CPlusPlusSourceParser cp new CPlusPlusS
  • 如何获取picturebox非公开成员的值?

    我需要从 picturebox 的非公共成员获取图像矩形的值 如何获得该值 提前致谢 这是使用反射获取值的方法 PropertyInfo pInfo pictureBox1 GetType GetProperty ImageRectangl
  • 异步方法调用和模拟

    为什么模拟用户上下文仅在异步方法调用之前可用 我编写了一些代码 实际上基于 Web API 来检查模拟用户上下文的行为 async Task
  • 创建新文件夹的“Shell 命名空间”方式是什么?

    显然 这对于 win32 api CreateDirectory 来说是微不足道的 但我正在尝试托管一个 IShellView 并且希望以最面向 shell 的方式来做到这一点 我本以为 IShellFolder 中会有一个 createo
  • C 中的 const 和指针

    将 const 与指针一起使用可能会导致指针对象无法通过使用相关指针取消引用来修改 但为什么我也不能修改指针不直接指向的内容呢 例如 int a 3 const int ptr a ptr 5 不会编译 但为什么 ptr 2 5 还编译不了
  • 动态方法的实际例子?

    我想学习动态方法及其使用 C 的实际示例 动态方法和Reflection有什么关系吗 请帮我 我们正在使用动态方法来加速反射 这是我们的反射优化器的代码 只比直接调用慢10 比反射调用快2000倍 public class Reflecti
  • 如何检测任务栏上的右键单击

    我有一个 C 语言的 Windows 窗体应用程序 它以加载对话框开始 正如预期的那样 该应用程序的按钮会显示在 Windows 任务栏中 我想检测可能对该按钮进行的 右键单击 最终 我希望禁用右键单击或只是让加载对话框重新获得焦点 我看到
  • SQL:使用 1 个查询更新一行并返回列值

    我需要更新表中的一行 并从中获取列值 我可以这样做 UPDATE Items SET Clicks Clicks 1 WHERE Id Id SELECT Name FROM Items WHERE Id Id 这会生成 2 个对该表的计划
  • 如何搜索来自另一个页面模型的串联名称列表?

    我的项目中有多个模型 但在下面的屏幕中 大多数字段 属性都位于 SecurityLog 模型中 下面是我显示的官员串联列表 除了军官姓名之外 我的搜索和列标题排序功能正常 我很难合并官员姓名 因为该列表来自另一个页面模型 这是我的数据库架构
  • 生成一定范围内的 N 个随机数,其总和为常数

    我想生成从 a b 之间的特定分布 例如均匀随机 抽取的 N 个随机数 其总和为常数 C 我尝试了一些我自己能想到的解决方案 以及在类似线程上提出的一些解决方案 但是他们中的大多数要么适用于有限形式的问题 要么我无法证明结果仍然遵循所需的分
  • Microsoft.IdentityModel.Clients.ActiveDirectory.UserCredential 不采用 2 个参数?

    我在代码中使用 ADAL 我想要使 用的一件事是使用不同的凭据 因此我可以在控制台程序中针对 Azure AD 授权不同的用户 Microsoft IdentityModel Clients ActiveDirectory UserCred
  • 画笔和钢笔使用指南

    制作 GDI 画笔和钢笔有多贵 我应该在添加所需的基础上创建它们并将它们包装在 using 中以便快速处理它们 还是应该创建一个类似于 System Drawing Brushes 类的静态类 IMO 它们足够高效 您通常不应该创建在多个方
  • 为什么对于某些数组 A,sizeof(A) 在函数内不起作用? [复制]

    这个问题在这里已经有答案了 下列 include
  • 为什么禁止在后续私有派生类中简单提及基指针/引用?

    struct B struct D private B B fun return new D ok struct DD public D B foo return 0 error struct B B B is inaccessible 这

随机推荐