我想我在lambdas和可调用对象之间发现了另一个“铿锵vs gcc”的不一致性。
::运算符()应该等同于C::运算符(),但是如果通用lambda中的变量包为空,gcc拒绝编译:
15:错误:对'(main()::)(int)'l(1)的调用不匹配;
15:注意:候选:decltype(((main():)0u)。main():(x,)(*)(自动:1
15:注:候选人需要3个参数,提供2个
14:注意:候选:模板main()::
1)自动
14:注意:模板参数扣除/替换失败:
15:注:候选人需要2个参数,1个参数提供
l(1);
godbolt.org.的活生生的例子
struct C
{
template<typename T, typename... TRest>
auto operator()(T&& x, TRest&&...){ return x; }
};
int main()
{
// Compiles both with clang and gcc.
auto c = C{};
c(1);
// Compiles with clang 3.7.
// Does not compile with gcc 5.2.
auto l = [](auto&& x, auto&&...) { return x; };
l(1);
}
在gcc bug跟踪器上找不到与此相关的任何内容(但没有花太多时间搜索)-gcc在这里错了吗?
我已将此问题报告为gcc bug#68071。
来自声明/功能/9.3.4.6/6.2(我很抱歉如何引用标准中的具体句子): 显式对象参数声明是带有this说明符的参数声明。显式对象参数声明只能作为参数声明列表的第一个参数声明出现:(6.1)声明成员函数的成员声明符([class.mem])或(6.2)lambda声明符([expr.prim.lambda])。 如果lambda表达式允许此作为显式对象参数,那么当我们同时捕获变量时会发生什么?
对不起,我不知道这个问题的标题是什么。 我在C中有一个函数,它以λ作为参数。 然后我尝试调用这个函数。 我的问题是,我无法从lambda函数内部访问变量,如果我试图用
我正在寻找一种方法来调用多个参数方法,但是使用构造。文档中说只有在能够映射到功能接口时才可用。 基本上,如上所述,考虑使用中不同数量的属性的方法。
问题内容: 看到以下代码的输出,我感到很惊讶: 它输出 为什么会这样呢? 我以为该代码不会编译,因为对的调用是 模棱两可的 ,但它运行良好并可以输出。 如果我将代码修改为: 没有错误消息。 为什么第一个代码可以正常运行,但是第二个却给出错误? 问题答案: 此行为是由于与和之间没有这种比较相比,它更具体。 如JLS 第15.12.2.5节(强调我的)中所述: 如果满足以下任一条件,则使用参数表达式e
对于变量和参数,不管是已经敲代码多年的老鸟,还是刚刚接触编程的小白,都会有时候清楚,有时候又有点模糊。因为,在实际应用中,它们之间分分离离,比如,敲代码都知道,x=3中x是变量,它不是参数,但是在函数y=3x+4中,x是变量,也是参数。那么什么这两个到底有什么区别和联系呢?我在网上搜了一下,发现很多说法,虽然大同小异,但是似乎只有下面这一段来自微软网站的比较高度抽象,而且意义涵盖深远。我摘抄过来,
有时,当您想要一个函数时,您可能会遇到这种情况,该函数可以使用可变数量的参数,即参数,而不是预定义数量的参数。 C编程语言为这种情况提供了解决方案,您可以根据需要定义一个可以接受可变数量参数的函数。 以下示例显示了此类函数的定义。 int func(int, ... ) { . . . } int main() { func(1, 2, 3); func(1, 2,