当前位置: 首页 > 知识库问答 >
问题:

clang vs gcc-空的通用lambda变量参数包

谯嘉木
2023-03-14

我想我在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在这里错了吗?

共有1个答案

盖弘毅
2023-03-14

我已将此问题报告为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,