Clang 3.7.0 抱怨类不是字面意思,因为它不是聚合并且没有 constexpr 构造函数

2023-12-06

以下代码在 GCC (4.9.3) 和 VC++ (19.00.23506) 中编译良好,但在 Clang (3.7.0) 中给出这些错误。

错误:constexpr 函数的返回类型“Foo”不是文字类型

注意:“Foo”不是字面意思,因为它不是聚合并且没有 除复制或移动构造函数之外的 constexpr 构造函数

Code:

#include <iostream>
#include <vector>

struct Foo
{
    std::vector<int> m_vec;
    Foo(const int *foo, std::size_t size=0):m_vec(foo, foo+size)
    {;}
    //Foo(const std::initializer_list<int> &init):m_vec{init}
    //{;}
};


template <std::size_t N>
constexpr Foo make_fooArray(const int (&a)[N]) noexcept
{
    return {a,N};
}


int main()
{
    Foo f{ make_fooArray({1,2,3}) };

    for (auto i : f.m_vec)
        std::cout<< i <<" ";
    std::cout<<std::endl;
}

在 rextester 上运行的代码:

海湾合作委员会和风险投资公司

Clang

您能澄清一下这是编译器错误还是我错过了什么? C++11 标准怎么说?


这是另一种情况,它可以在 GCC 和 VC 中编译,但不能在 Clang 中编译。

#include <iostream>

template <typename T, std::size_t N>
constexpr std::size_t sizeOf_fooArray(const T (&)[N]) noexcept
{
    return N;
}

int main()
{
    std::cout<< sizeOf_fooArray({16,20,53,87,54,7}) <<std::endl;
}

但是,如果您为 int[] 指定别名并显式使用它来指定initializer_list 的类型,则它适用于所有编译器。

#include <iostream>

template <typename T, std::size_t N>
constexpr std::size_t sizeOf_fooArray(const T (&)[N]) noexcept
{
    return N;
}

using intArray = int[]; //Added

int main()
{
    std::cout<< sizeOf_fooArray(intArray{16,20,53,87,54,7}) <<std::endl;
}

所有编译器都是对的。

一般来说,使用函数模板,一个实例化就可以满足某一函数的要求。constexpr功能,但另一个没有。通常,这意味着constexpr对于那些不满足要求的实例,实际上会被默默地忽略。例子:

template <typename T> constexpr T f(T v) { return v; }

这俩f<int> and f<std::string>实例化是有效的,但是f<std::string>不能在常量表达式中调用。

然而,作为该规则的例外,如果没有any可能的模板参数可能会导致满足通常要求的实例化constexpr功能,程序格式错误,无需诊断。这意味着编译器可以完全忽略此规则,但同样可以将代码诊断为致命错误。

一般来说,不可能可靠地检测到违反此规则的情况,因此不需要进行诊断。有些编译器比其他编译器更努力地仍然提供一些诊断。

所有这些都在 [dcl.constexpr]p6 的标准中进行了描述:

如果实例化的模板特化为constexpr函数模板或类模板的成员函数将无法满足constexpr函数或constexpr构造函数,该专业化仍然是constexpr函数或constexpr构造函数,即使对此类函数的调用不能出现在常量表达式中。如果没有专门化的模板可以满足constexpr函数或constexpr构造函数 当被视为非模板函数或构造函数时,模板是格式错误的;无需诊断。

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

Clang 3.7.0 抱怨类不是字面意思,因为它不是聚合并且没有 constexpr 构造函数 的相关文章

随机推荐

  • 为什么我的模板不接受初始化列表

    我创建了一个模板 如下所示 template
  • 如何在 Mac OS X Mavericks 中获取 Java 32 位

    我正在尝试在我的 MAC 上设置 Openfire XMPP 服务器 但问题是我需要升级到 Maverick for Titanium 一旦升级到 Maverick Java 就会更新到 64 位 而不是 Openfire 所需的 32 位
  • 如何在 Eclipse 中运行 django 测试以使调试成为可能,但在测试数据库上

    我有一个困扰我很长时间的问题 我使用 Pydev 或 Nose 测试运行器从 eclipse Python 单元测试 运行测试 这样就可以调试测试并在 PyUnit 视图中观察它们 但这样就不会创建测试数据库 也不会使用manage py
  • 需要使用TypeORM/NestJS在PostgreSQL数据库中上传文件

    任何人都可以帮忙解决这个问题吗 我需要使用 TypeORM NestJS 将文件上传到 PostgreSQL 数据库 文件是表单的一部分 我已经采取了以下实体类 export class Certificate ApiProperty Pr
  • 如何在R中写出具有不同文件名的多个文件

    我有一个大文件 gt 10000 行数据 我想按 ID 写出一个单独的文件 我有 50 个唯一的 ID 名称 我想要为每个名称创建一个单独的文本文件 这是我到目前为止所得到的 但我不断收到错误 我的ID实际上是字符串 如果我能用该字符串命名
  • 使用 sqlalchemy 和 mysql unix 时间戳定义表

    背景 MySQL 中有多种存储日期的方法 作为字符串 例如 2009 年 9 月 9 日 作为使用函数 UNIX TIMESTAMP 的整数 这被认为是传统的 UNIX 时间表示 您知道自纪元加 减闰秒以来的秒数 作为MySQL TIMES
  • HTML5发布及修改时间

    我想包括一篇文章的发表和修改时间 我查看了文档 但找不到有关此的信息 到目前为止 我得到了这个
  • QFile::flush() 与 QFile::close()

    我正在类中实现一个方法 它将数据从 TableView 对象写入 CSV 文件 然而 当程序运行时 程序以非常慢的速度 3或4秒 将数据写入USB驱动器上的文件 但在系统的内部驱动器上运行良好 这是因为我在写入文件后没有使用flush 或c
  • 如何在 Android Gridview 中设置替代行颜色?

    如何在网格视图中设置替代行颜色 我搜索了很多关于如何设置网格视图行颜色的教程 但没有关于网格视图行颜色的信息 我得到的列表视图仅具有替代行颜色 我需要交替行应该是白色和黑色 在这里我包括我的代码 请帮我 这是 Java 类 public c
  • 正则表达式用逗号替换客户评论中的一些点

    我需要写一个正则表达式来替换 with 在一些患者对药物的评论中 他们应该在提到副作用后使用逗号 但其中一些使用了点 例如 text the drug side effects are night mare nausea night swe
  • 透明地记录下载的最佳方式?

    我有一个个人项目 已经上线一段时间了 我一直通过这样做来记录下载量 当用户单击下载链接时 它会点击一个 PHP 脚本 该脚本将一些信息写入表中 写入数据后 脚本将返回实际文件的路径 然后 用户可以将文件保存到硬盘上 就像下载任何其他文件一样
  • ListViewAnimations 库导致顶级异常

    我正在尝试将此库嵌入到我的 Android 项目中 正如他们的 wiki 中所说 我做了很少的事情 添加了 gradle 编译行compile com nhaarman listviewanimations library 2 6 0 然后
  • 新的 iOS 应用程序与 Facebook Graph api v2.0 作斗争

    我是应用程序开发新手 我一直在构建一个社交 iOS 应用程序 需要发送 Facebook 邀请才能加入该应用程序 昨天发布的 Facebook Graph API 2 0 似乎对如何邀请尚未参与游戏的人提出了更严格的要求 我正在尝试激活 m
  • 如何使设备顶部面板(状态栏)与flutter中的AppBar具有相同的背景颜色?

    如何使设备顶部面板 状态栏 与flutter中的AppBar具有相同的背景颜色 设备顶部面板的颜色始终比 AppBar 背景颜色深 多谢 在 iOS 上 这已经是事实了 在 Android 上 添加以下内容onCreate in MainA
  • Apache RewriteRule 用于删除任何域名上的端口

    我有一台具有一个 IP 地址的虚拟服务器 为几个不同的站点提供服务 其中之一带有 SSL 证书 我需要在第二个域上添加 SSL 证书供我自己私人使用 由于我只有一个 IP 地址 所以我将其添加到端口 8080 上 这很好用 我现在的问题是
  • 为什么flink容器vcore大小始终为1

    我在yarn上运行flink 更准确地说是在AWS EMRyarn集群中 我阅读了flink文档和源代码 默认情况下 对于每个任务管理器容器 当从yarn请求资源时 flink将请求每个任务管理器的插槽数量作为vcore的数量 而且我也从源
  • 如何在R中将二进制小数转换为十进制小数?

    我需要编写一个函数 将二进制小数转换为 R 中的十进制小数 f 0 001 0 125 我做了什么 我搜索了R包中的相关函数 DescTools BinToDec 0 001 NA DescTools BinToDec 0 001 NA b
  • React Ionic 5:如何将对象从App组件传递到Tab组件

    我使用 Ionic 5 选项卡模板创建了一个 Ionic React 应用程序 我想将一个对象从应用程序组件传递到选项卡组件 有什么办法可以做到吗 Tab1 和 Tab2 是我的选项卡组件 Note 我希望这个对象在两个选项卡组件中使用两种
  • 扫描直到新行

    我想读取输入的所有文本 直到输入新行字符 这是我的代码 int i 0 char ch MAX printf Enter the text n while true scanf c ch i if ch i n break i 但当我尝试执
  • Clang 3.7.0 抱怨类不是字面意思,因为它不是聚合并且没有 constexpr 构造函数

    以下代码在 GCC 4 9 3 和 VC 19 00 23506 中编译良好 但在 Clang 3 7 0 中给出这些错误 错误 constexpr 函数的返回类型 Foo 不是文字类型 注意 Foo 不是字面意思 因为它不是聚合并且没有