可以在C++ 14 constexpr函数中使用for循环实例化模板吗?

 1076263105_69ae53 发布于 2023-02-12 12:36

我一直在乱搞SVN构建的clang来试验放松的规则constexpr.我之前无法确定的一件事是,是否可以在constexpr函数中在编译时循环遍历元组内的元素.

因为我没有要测试的符合C++ 14的标准库,所以我准备了以下等效测试:

template
constexpr int foo() {
  return N;
}

constexpr int getSum() {
  auto sum = 0;
  for (auto i = 0; i < 10; ++i) {
    sum += foo();
  }
  return sum;
}

constexpr auto sum = getSum();

这里有趣的部分是foo().在非constexpr函数中,我希望它无法编译,因为您根本无法使用运行时int来生成模板的编译时实例化.constexpr但是,因为这是一个功能,我怀疑这是否可行.特别是,该值在编译时是已知的,即使它允许变异.

我知道以下代码编译:

constexpr auto nValue = 2;
foo();

在SVN clang中,我的第一个例子没有:

test2.cpp:19:12: error: no matching function for call to 'foo'
    sum += foo();
           ^~~~~~
test2.cpp:11:15: note: candidate template ignored: invalid explicitly-specified
      argument for template parameter 'N'
constexpr int foo() {
              ^

对于初学者,我很难解释此错误消息的第二部分.除此之外,它是否由C++ 14标准强制执行,如果是这样,有人知道为什么不允许这种语法(简单的监督或防止某些事情)?

撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有