首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在C++函数模板中,为什么不能使用lambda来指定参数的数组大小?

在C++函数模板中,为什么不能使用lambda来指定参数的数组大小?
EN

Stack Overflow用户
提问于 2022-03-31 13:50:55
回答 1查看 67关注 0票数 1

我在尝试实现SFINAE欺骗时偶然发现了以下情况(实际上我试图实现的是无关紧要的,我不想理解这种行为):

我定义了一个constexpr函数,该函数引用大小为1的数组,但通过lambda调用指定数组大小:

代码语言:javascript
复制
constexpr bool f(const char(&)[+[](){return 1;}()]) {
  return true;
}

( lambda之前的+是因为编译器抱怨连续两个左括号。)

我添加了一个调用函数:

代码语言:javascript
复制
constexpr bool g() {
  char x[1] = {};
  return f(x);
}

这汇编得很好。

现在我尝试并实例化:

代码语言:javascript
复制
template<typename T>
constexpr bool f(const char(&)[+[](){return 1;}()]) {
  return true;
}

constexpr bool g() {
  char x[1] = {};
  return f<int>(x);
}

这一次我得到了一个奇怪的编译器错误:

代码语言:javascript
复制
ERROR: maps/suggest/indexer/nhr/nhr_flume_flags.cc:134:45 no matching function for call to 'f'
constexpr bool g() { char x[1] = {}; return f<int>(x); }
                                            ^~~~~~~
maps/suggest/indexer/nhr/nhr_flume_flags.cc:130:16 candidate function [with T = void] not viable: no known conversion from 'char[1]' to 'const char[+[]() {
    return 1;
}()]' for 1st argument
constexpr bool f(const char(&)[+[](){return 1;}()]) { return true; }
               ^
1 error generated.

我为什么要犯这个错误?

我使用的命令是:/usr/lib/llvm-11/bin/clang++ -stdlib=libstdc++ -std=c++17 myprog.cc

编译器的版本信息是:

代码语言:javascript
复制
Debian clang version 11.1.0-4+build3
Target: x86_64-pc-linux-gnu
Thread model: posix
InstalledDir: /usr/lib/llvm-11/bin
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-03-31 14:00:05

,为什么我会收到这个错误?

/usr/lib/llvm-11/bin/clang++ -stdlib=libstdc++ -std=c++17 myprog.cc

在C++17中不允许在函数签名中使用lambda:

expr.prim.lambda

lambda表达式是一个prvalue,其结果对象称为闭包对象。-表达式不应在未计算的操作数中、模板参数中、别名声明中、类型胡枝子声明中,或在函数或函数模板的声明中,在函数体和默认参数之外出现。注意:的目的是防止lambdas出现在签名中。 - 尾注 

这个节目的格式不正确.诊断信息还有改进的余地。不诊断非模板是编译器的错误。

使用常量是很容易的。读起来也容易得多:

代码语言:javascript
复制
constexpr inline auto s = [](){return 1;}();

template<typename T>
constexpr bool f(const char(&)[s])

由于提议P0315,应该在C++20中允许它,因为突出显示的规则部分被删除了。然而,Clang仍然无法在C++20中编译它,据我所知,这是一个bug。目前,Clang对P0315的支持被列为“部分”。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71693714

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档