如何使用 std::copy 将 constexpr 数组复制到另一个 constexpr 数组?

2024-01-04

在下面的代码中,我创建了一个长度为 6 的数组,并在前 3 个元素中使用 1、2 和 3 对其进行初始化。然后我将前 3 个元素复制到后 3 个元素。然后我按顺序打印所有元素。

std::array<int, 6> bar = {1, 2, 3};

int main(){
    // Copy the first 3 elements to the last 3 elements
    std::copy(bar.begin(), bar.end() - 3, bar.end() - 3);

    // Print all the elements of bar
    for(auto& i: bar) std::cout << i << std::endl;
}

它工作正常,但是当我尝试制作数组时constexpr它不再编译:

constexpr std::array<int, 6> bar = {1, 2, 3};

int main(){
    // Copy the first 3 elements to the last 3 elements
    std::copy(bar.begin(), bar.end() - 3, bar.end() - 3); // Won't compile!

    // Print all the elements of bar
    for(auto& i: bar) std::cout << i << std::endl;
}

编译用g++ -std=c++14 main.cpp -o main我收到以下错误消息:

/usr/include/c++/5/bits/stl_algobase.h: In instantiation of ‘_OI std::__copy_move_a(_II, _II, _OI) [with bool _IsMove = false; _II = const int*; _OI = const int*]’:
/usr/include/c++/5/bits/stl_algobase.h:438:45:   required from ‘_OI std::__copy_move_a2(_II, _II, _OI) [with bool _IsMove = false; _II = const int*; _OI = const int*]’
/usr/include/c++/5/bits/stl_algobase.h:471:8:   required from ‘_OI std::copy(_II, _II, _OI) [with _II = const int*; _OI = const int*]’
main.cpp:115:53:   required from here
/usr/include/c++/5/bits/stl_algobase.h:402:44: error: no matching function for call to ‘std::__copy_move<false, true, std::random_access_iterator_tag>::__copy_m(const int*&, const int*&, const int*&)’
                        _Category>::__copy_m(__first, __last, __result);
                                            ^
/usr/include/c++/5/bits/stl_algobase.h:373:9: note: candidate: template<class _Tp> static _Tp* std::__copy_move<_IsMove, true, std::random_access_iterator_tag>::__copy_m(const _Tp*, const _Tp*, _Tp*) [with _Tp = _Tp; bool _IsMove = false]
         __copy_m(const _Tp* __first, const _Tp* __last, _Tp* __result)
         ^
/usr/include/c++/5/bits/stl_algobase.h:373:9: note:   template argument deduction/substitution failed:
/usr/include/c++/5/bits/stl_algobase.h:402:44: note:   deduced conflicting types for parameter ‘_Tp’ (‘int’ and ‘const int’)
                        _Category>::__copy_m(__first, __last, __result);

我根本不明白这个错误消息。是std::copy not constexpr?如果不是,那也应该是吧?如果我的代码可以工作吗std::copy was constexpr?


您应该创建一个 constexpr 函数。constexpr暗示 const,但不在 a 范围内constexpr功能。

constexpr auto get_bar() {
    std::array<int, 6> bar = {1, 2, 3, 0, 0, 0};

    copy(bar.begin(), bar.end() - 3, bar.end() - 3);

    return bar;
}

但是,您需要编写自己的版本copy因为它没有标记为constexpr在标准库中。

更改编译时数组的值没有意义,这与要求编译器在运行时更改变量的类型是一样的。编译器在运行时甚至不存在。然而,constexpr 函数是由编译器执行的,因此要求它改变值仍然是有意义的。这就是上面的代码有意义的原因。

请注意,大多数std::array访问器不是constexpr直到 C++17。

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

如何使用 std::copy 将 constexpr 数组复制到另一个 constexpr 数组? 的相关文章

随机推荐

  • Zend_db 更新更好的错误报告

    当我更新记录时 我使用 更新 的结果来确定它是否正常工作 a this gt db gt insert self TABLE saveData a 1 表示更新了一条记录 a 0 表示它没有更新任何内容 如果表格没有任何改变 我可以得到 0
  • C 和 C++ 中的声明/定义作为语句

    当这不能在 C 中编译时我很困惑 int main for int i 0 i lt 4 i int a 5 A dependent statement may not be declaration return 0 我习惯了 C 来编译它
  • 为什么我使用 UpdateSourceTrigger=PropertyChanged ,TwoWay 还不够?

    你好 有源和目标文本框 txttarget 与 txtsource 绑定 当在 txtsource 中写入内容时 txttarget 发生了变化 一切都很好 但是在 txttarget 上写入时 我没有看到 txttarget 有任何变化
  • 四开不渲染

    我的四开文档突然停止渲染 我已重新安装 RStudio 和 quarto 软件包 但此问题仍然存在 当我打开新的四开文档时 我不再在新文档中看到样板材料 该文档是空的 就像我选择了一样Create Empty Document 但我没有 然
  • Spyder默认模块导入列表

    我正在尝试设置一个稍微定制的 Spyder 版本 当 Spyder 启动时 它会自动导入一长串模块 包括来自 matplotlib numpy scipy 等的模块 有没有办法将我自己的模块添加到该列表中 为了以防万一 我使用 Python
  • Linux:杀死后台任务

    如何终止 Linux 中最后生成的后台任务 Example doSomething doAnotherThing doB doC doD kill doB 你可以通过工作号码杀人 当您将任务置于后台时 您会看到类似以下内容的内容 scrip
  • 有多少内存使用字节枚举,这是否优化了 C# 中的内存/速度?

    在 C 中使用字节枚举进行小型枚举是一种好处还是一种好的做法 这会减少内存使用吗 这能提高速度吗 Example enum Fruits byte Apple Orange Banana 相比之下有什么优势 enum Fruits Appl
  • iPad Pro 图标和启动图像

    我正在开发一个基于 adobe air 的 iOS 应用程序 我需要知道最近为 iPad Pro 添加的资源的名称 启动图像 2048 x 2732 和图标 167x167 不幸的是 根据以前的名字很难猜出他们的名字 我找到 电子邮件受保护
  • IdentityServer4使用ApiKey或Basic身份验证直接到API

    我正在使用 IdentityServer4 让我的客户通过 JavaScript 登录并访问网页和 api 并且运行良好 然而 有一个新的要求 而不是使用用户名和密码从身份服务器获取访问令牌 然后使用它通过承载身份验证访问 api 我需要使
  • Knockout js jquery范围滑块&& 2个输入

    我需要一些帮助 我有一个代码http jsfiddle net ZNvWR 19 http jsfiddle net ZNvWR 19 我是淘汰赛新手 找不到任何解决方案 那么 如何重写此代码以获取工作输入 更改输入中的值会更改滑块值 di
  • 有没有办法使用动态修订来指定 Ivy 依赖项但限制状态?

    我是否可以使用动态修订来声明依赖项 同时限制检索到的工件的状态 例如 我想定义一个版本范围 例如 1 0 1 1 但我不想要具有集成状态的工件 只需要里程碑或发布 因此 如果版本 1 0 5 的状态为 发布 即使版本 1 0 6 的状态为
  • Perl 中 -> 和 :: 有什么区别

    两者之间的确切区别是什么 and gt 在 Perl 中 gt 有时在哪里工作 才不是 有两个用途 它是包名称中的命名空间分隔符 use Foo Bar Load Foo Bar pm Foo Bar var var in namespac
  • 在使用 @angular/localize 本地化原始应用程序后,如何“服务”原始应用程序?

    我正在使用 Angular 的本地化 angular localize 并将其配置为将应用程序翻译为不同的语言我尝试使用 ngserve 提供它的默认版本但我收到此错误 An unhandled exception occurred The
  • NDB 是否仍然以 default=None 或属性设置为 None 进行索引?

    我希望能够运行如下查询 MyModel query MyModel some property None 并得到结果 我知道如果我不放default
  • 通过终端获取 Docker for mac 代理变量

    我在代理后面使用 Docker for mac 我在 Docker GUI 中的 代理 gt 手动代理配置 下设置了代理配置 这让我可以从代理后面的存储库下载 Docker 映像 接下来 我设置http proxy and https pr
  • 为什么 IIS 8.0 Express 在 Visual Studio 2012 中重命名后使用旧项目名称

    经过一些命名混乱后 我的团队决定重命名一些项目以及项目中所有现有代码文件的命名空间 在 Visual Studio 2012 中 我们改变了 项目名称 项目属性中的程序集名称 默认命名空间 标题和产品条目 已重命名的每个项目中每个代码文件的
  • 如何使用 PDO 清理输入?

    我需要使用吗mysql real escape string 根据我的输入 例如 POST and GET 当我使用PDO http php net manual en book pdo php图书馆 如何使用 PDO 正确转义用户输入 如
  • Binance API 和 Angular 4 httpClient

    我有关于币安加密货币市场的问题 他们有公共 API 我认为我可以在 Angular 中使用它来创建交易应用程序 但我有一些麻烦 在 Chrome 中使用该链接我得到 json 结果 https api binance com api v1
  • LinkedList.iterator() 返回什么对象?

    将它们视为一个对象 Iterator
  • 如何使用 std::copy 将 constexpr 数组复制到另一个 constexpr 数组?

    在下面的代码中 我创建了一个长度为 6 的数组 并在前 3 个元素中使用 1 2 和 3 对其进行初始化 然后我将前 3 个元素复制到后 3 个元素 然后我按顺序打印所有元素 std array