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

空包的函子变量模板包展开在clang和g中给出了不同的结果

齐坚成
2023-03-14

以下代码使用clang 3.8.0成功编译,但使用g 7.2.0编译失败(使用编译标志):

auto foo = [](auto functor, auto... argument_functors)
{
    functor(argument_functors()...);
};

auto do_nothing = [](auto...) {};


int main()
{
    foo(do_nothing);
}

g错误消息:

main.cpp: In instantiation of '<lambda(auto:1, auto:2 ...)> [with auto:1 = <lambda(auto:3, ...)>; auto:2 = {}]':
main.cpp:11:16:   required from here
main.cpp:3:9: error: no match for call to '(<lambda(auto:3, ...)>) ()'
  functor(argument_functors()...);
  ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~
main.cpp:6:29: note: candidate: template<class auto:3> <lambda(auto:3, ...)>::operator decltype (((const<lambda(auto:3, ...)>*)((const<lambda(auto:3, ...)>* const)0))->operator()(static_cast<auto:3&&>(<anonymous>))) (*)(auto:3, ...)() const <deleted>
 auto do_nothing = [](auto...) {};
                             ^
main.cpp:6:29: note:   template argument deduction/substitution failed:
main.cpp:3:9: note:   candidate expects 1 argument, 0 provided
  functor(argument_functors()...);
  ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~
main.cpp:6:29: note: candidate: template<class auto:3> <lambda(auto:3, ...)>
 auto do_nothing = [](auto...) {};
                             ^
main.cpp:6:29: note:   template argument deduction/substitution failed:
main.cpp:3:9: note:   candidate expects 1 argument, 0 provided
  functor(argument_functors()...);
  ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~

哪种编译器行为符合标准?

共有1个答案

燕宜修
2023-03-14

这是gcc错误64095。

来自【现金流量】/18:

当省略号出现在没有前面逗号的参数声明子句的末尾时,存在语法歧义。在这种情况下,如果参数的类型命名了尚未扩展的模板参数包或包含auto,则省略号将被解析为抽象声明子句的一部分;否则,它将被解析为参数声明子句的一部分。

基本上,参数列表中的(T...)可以解释为:

  • 一个类型为T的未命名参数和一个省略号
  • 函数参数包,具有模板参数包类型

如果T是一个模板参数包或auto,那么消歧规则应该倾向于后者,但gcc选择将其解释为省略号参数。

 类似资料:
  • 问题内容: 我试图将值放入“标题”模板中,例如标题和导航链接,但无法访问我从包含的模板发送到主模板的变量。 渲染模板: index.html模板: header.html模板: 显然,它不会那样工作。 也许有一种方法可以解析/获取模板并将变量放入其中,而无需将整个头文件放入代码中?然后,我可以将该模板作为变量发送到我的主模板。但这似乎并不是最好的方法。 问题答案: 您可以在调用模板时将上下文传递给

  • 我正在定义一个类的构造函数,该构造函数约束检查传入迭代器的基础类型与类中定义的node_type的类型等价性,并借助概念或SFINAE。 但是,尝试了一些与

  • 我想我在lambdas和可调用对象之间发现了另一个“铿锵vs gcc”的不一致性。 ::运算符()应该等同于C::运算符(),但是如果通用lambda中的变量包为空,gcc拒绝编译: 15:错误:对'(main()::)(int)'l(1)的调用不匹配; 15:注意:候选:decltype(((main():)0u)。main():(x,)(*)(自动:1 15:注:候选人需要3个参数,提供2个

  • 我试图通过HTTP向服务器发送一个SHA256哈希字符串,在那里我想通过执行SHA256哈希并验证两个匹配来进行身份验证。出于测试目的,我使用相同的字符串,但是结果不匹配。这可能是我的base64_encode调用的默认编码方案吗?谢谢 在PHP中,我正在做: 我在做什么

  • 下面的代码在g7.2.0中编译成功(编译标志是),但在clang 5.0.0中编译失败(使用相同的标志,)和vc 15.4(编译标志是): 哪种编译器行为符合标准?如何将该模板应用更改为在clang上编译? 叮当声错误消息: VC错误消息:

  • 让我们有一个简单的测试代码: 在Oracle/SUN中,java输出为(带空格): 4. 但在IBM java中,我得到了: 四千 我的java: java版本“1.7.0_51”java(TM)SE运行时环境(构建1.7.0_51-b13)java热点(TM)64位服务器虚拟机(构建24.51-b03,混合模式) IBM java: java版本java版本"1.6.0"Java(TM)SE运行