V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Hconk
V2EX  ›  C++

看到一段挺有意思的 C++代码

  •  
  •   Hconk · 2021-08-27 14:28:23 +08:00 · 3546 次点击
    这是一个创建于 944 天前的主题,其中的信息可能已经有所发展或是发生改变。

    这段代码 GCC 能编译通过。VS/Clang 会报错。

    void f() {
      return  [ ] [ [ ] ] ( ) [ [ ] ] { [ [ , , , ] ] ; } ( ) ; 
    }
    
    第 1 条附言  ·  2021-08-27 20:39:12 +08:00
    #7 的同学已经把原理讲的挺清楚了。讲一下这段代码的来源吧,是从 C++标准委员会成员 Aaron Ballman 简介里看到的,链接: https://isocpp.org/wiki/faq/wg21#aaron-ballman
    11 条回复    2021-08-31 23:42:40 +08:00
    AoEiuV020
        1
    AoEiuV020  
       2021-08-27 14:41:43 +08:00
    看不懂,猜是 ub,
    GeruzoniAnsasu
        2
    GeruzoniAnsasu  
       2021-08-27 14:42:59 +08:00
    这些[[]]都是 attributes 吗

    原来有这么多能放的位置……
    AoEiuV020
        3
    AoEiuV020  
       2021-08-27 14:44:20 +08:00
    你哪个版本的 gcc? 我就没编译通过,
    error: expected expression before ‘[’ token
    error: void value not ignored as it ought to be
    Hconk
        4
    Hconk  
    OP
       2021-08-27 14:47:09 +08:00
    @AoEiuV020 要用 g++,这是 C++代码。
    kalluwa
        5
    kalluwa  
       2021-08-27 14:59:47 +08:00
    嵌套 lambda?
    GeruzoniAnsasu
        6
    GeruzoniAnsasu  
       2021-08-27 16:53:12 +08:00   ❤️ 1
    仅 gcc 支持捕获列表后的 attribute,
    void f(...){[](...)[[,,,]]{[[,,,]];}();}
    上面这行去掉了捕获列表后的[[]],可以在其它编译器中通过
    zzxxisme
        7
    zzxxisme  
       2021-08-27 19:54:13 +08:00   ❤️ 10
    尝试说一下我的理解。
    1. 首先 [](){} 这样就是创建了一个 不接受任何输入,什么都不做,没有任何输出的 lambda
    2. 然后 [](){} () 就是调用了一下上面说的 lambda

    剩下的就是在加 attributes

    3. lambda 声明返回值类型的地方是可以加 attribute 的,例如加一个[[noreturn]]就是 []() [[noreturn]] {}。而 [[ ]] 就是…加 0 个 attribute 。
    4. 大括号里面的执行体里面也可以加 attribute,而且可以一次加多个,例如同时加 likely, fallthrough 就是 [[ likely, fallthrough ]]。而 [[ , , , ]] 就是…什么 attribute 也没有加。
    5. 找了一份 C++ standard draft 看了一下 lambda expression 的定义,捕捉列表和参数列表应该是不可以加 attribute 的。我找的是这份 draft: https://eel.is/c++draft/expr.prim.lambda#nt:lambda-specifiers,可以看到 lambda-introducer (也就是捕捉列表)和 parameter-declaration-clause (就是 lambda-declarator 里面)之间是没说可以放东西的。
    yyt6801
        8
    yyt6801  
       2021-08-27 20:40:09 +08:00 via Android
    @zzxxisme 给大佬递烟
    agagega
        9
    agagega  
       2021-08-28 12:30:02 +08:00 via iPhone
    原来 attribute 里面还能放逗号啊
    QBugHunter
        10
    QBugHunter  
       2021-08-31 20:05:40 +08:00
    请问是 fork 炸弹嘛。。
    Hconk
        11
    Hconk  
    OP
       2021-08-31 23:42:40 +08:00 via iPhone
    @QBugHunter 不是,这段代码没有任何作用,只是用到了几个 C++特性,第一眼看上去不像是能编译的代码。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   960 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 20:32 · PVG 04:32 · LAX 13:32 · JFK 16:32
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.