{"id":13419398,"url":"https://github.com/crossbario/autobahn-cpp","last_synced_at":"2025-06-10T12:09:52.535Z","repository":{"id":15284898,"uuid":"18014387","full_name":"crossbario/autobahn-cpp","owner":"crossbario","description":"WAMP for C++ in Boost/Asio","archived":false,"fork":false,"pushed_at":"2025-05-14T06:23:57.000Z","size":3150,"stargazers_count":251,"open_issues_count":69,"forks_count":106,"subscribers_count":32,"default_branch":"master","last_synced_at":"2025-05-14T07:36:20.323Z","etag":null,"topics":["asio","autobahn","boost","pubsub","real-time","rpc","wamp"],"latest_commit_sha":null,"homepage":"https://crossbar.io/autobahn","language":"C++","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"bsl-1.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/crossbario.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2014-03-22T16:44:05.000Z","updated_at":"2025-05-14T06:24:00.000Z","dependencies_parsed_at":"2024-07-31T00:47:14.033Z","dependency_job_id":"a123d70d-0625-4501-8d20-3d7f27a644d7","html_url":"https://github.com/crossbario/autobahn-cpp","commit_stats":null,"previous_names":["tavendo/autobahncpp"],"tags_count":7,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/crossbario%2Fautobahn-cpp","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/crossbario%2Fautobahn-cpp/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/crossbario%2Fautobahn-cpp/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/crossbario%2Fautobahn-cpp/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/crossbario","download_url":"https://codeload.github.com/crossbario/autobahn-cpp/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/crossbario%2Fautobahn-cpp/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":259072957,"owners_count":22801089,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["asio","autobahn","boost","pubsub","real-time","rpc","wamp"],"created_at":"2024-07-30T22:01:15.446Z","updated_at":"2025-06-10T12:09:52.517Z","avatar_url":"https://github.com/crossbario.png","language":"C++","funding_links":[],"categories":["TODO scan for Android support in followings","C++"],"sub_categories":[],"readme":"# AutobahnC++\n\nWAMP for C++ on Boost/ASIO.\n\n[![Linux CI](https://github.com/crossbario/autobahn-cpp/workflows/Linux%20CI/badge.svg)](https://github.com/crossbario/autobahn-cpp/actions?query=workflow%3A%22Linux+CI%22)\n[![Windows CI](https://github.com/crossbario/autobahn-cpp/workflows/Windows%20CI/badge.svg)](https://github.com/crossbario/autobahn-cpp/actions?query=workflow%3A%22Windows+CI%22)\n[![Documentation](https://img.shields.io/badge/docs-latest-brightgreen.svg?style=flat)](https://crossbario.github.io/autobahn-cpp-docs/)\n[![Docker toolchain image](https://img.shields.io/badge/docker-ready-blue.svg)](https://hub.docker.com/r/crossbario/autobahn-cpp/)\n\n---\n\n## Introduction\n\nAutobahnC++ is a subproject of **Autobahn** which provides a C++ [WAMP]([http://wamp.ws/](https://wamp-proto.org/)) implementation that is able to talk WAMP over `stdio` pipes.\n\n * **Caller**\n * **Callee**\n * **Publisher**\n * **Subscriber**\n\nAutobahnC++ is open-source, licensed under the [Boost Software License](LICENSE).\n\nThe API and implementation make use of modern C++ 11 and new asynchronous idioms using (upcoming) features of the standard C++ library, in particular **Futures**, [**Continuations**](http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2013/n3634.pdf) and **Lambdas**.\n\n\u003e [Continuations](http://en.wikipedia.org/wiki/Continuation) are *one* way of managing control flow in an asynchronous program. Other styles include: asynchronous [Callbacks](http://en.wikipedia.org/wiki/Callback_%28computer_programming%29), [Coroutines](http://en.wikipedia.org/wiki/Coroutine) (`yield` or `await`), Actors ([Erlang/OTP](http://www.erlang.org/), [Scala](http://www.scala-lang.org/)/[Akka](http://akka.io/) or [Rust](https://www.rust-lang.org/)) and [Transactional memory](http://en.wikipedia.org/wiki/Transactional_Synchronization_Extensions).\n\u003e\n\nAutobahnC++ supports running WAMP (`rawsocket-msgpack`) over **TCP(-TLS)**, **Unix domain sockets** or **pipes** (`stdio`). The library is \"header-only\", light-weight (\u003c 2k code lines) and **depends on** the following:\n\n * C++11 compiler\n * [`boost::future`](http://www.boost.org/doc/libs/1_66_0/doc/html/thread/synchronization.html#thread.synchronization.futures)\n * [`boost::asio`](http://www.boost.org/doc/libs/1_66_0/doc/html/boost_asio.html)\n * [`msgpack-c`](https://github.com/msgpack/msgpack-c)\n * [`WebSocket++`](https://github.com/zaphoyd/websocketpp)\n\nFor getting help, questions or feedback, get in touch on the **[mailing list](https://groups.google.com/forum/#!forum/autobahnws)**, **[Twitter](https://twitter.com/autobahnws)** or **IRC `#autobahn`** (Freenode).\n\n---\n\n\n## Show me some code!\n\nHere is how programming with C++ and AutobahnC++ looks like.\n\n**Calling a remote Procedure**\n\n```c++\nauto c1 = session.call(\"com.mathservice.add2\", std::make_tuple(23, 777))\n    .then([\u0026](boost::future\u003cwamp_call_result\u003e result) {\n        std::cout \u003c\u003c \"Got call result \" \u003c\u003c result.get().argument\u003cuint64_t\u003e(0) \u003c\u003c std::endl;\n    });\n```\n\n**Registering a remoted Procedure**\n```c++\nauto r1 = session.provide(\"com.myapp.cpp.square\",\n    [](autobahn::wamp_invocation invocation) {\n        std::cout \u003c\u003c \"Procedure is invoked ..\" \u003c\u003c endl;\n        uint64_t x = invocation-\u003eargument\u003cuint64_t\u003e(0);\n        return x * x;\n    })\n    .then([](boost::future\u003cautobahn::wamp_registration\u003e reg) {\n        std::cout \u003c\u003c \"Registered with ID \" \u003c\u003c reg.get().id() \u003c\u003c std::endl;\n    });\n```\n\n**Publishing an Event**\n\n```c++\nsession.publish(\"com.myapp.topic2\", std::make_tuple(23, true, std::string(\"hello\")));\n```\n\n**Publishing an Event (acknowledged)**\n\n```c++\nauto opts = PublishOptions();\nopts.acknowledge = True;\n\nsession.publish(\"com.myapp.topic2\", std::make_tuple(23, true, std::string(\"hello\")), opts)\n    .then([](boost::future\u003cautobahn::wamp_publication\u003e pub) {\n        std::cout \u003c\u003c \"Published with ID \" \u003c\u003c pub.get().id() \u003c\u003c std::endl;\n    });\n```\n\n**Subscribing to a Topic**\n\n```c++\nauto s1 = session.subscribe(\"com.myapp.topic1\",\n    [](const autobahn::wamp_event\u0026 event) {\n        std::cout \u003c\u003c \"Got event: \" \u003c\u003c event.argument\u003cuint64_t\u003e(0) \u003c\u003c std::endl;\n    })\n    .then([](boost::future\u003cautobahn::wamp_subscription\u003e sub) {\n        std::cout \u003c\u003c \"Subscribed with ID \" \u003c\u003c sub.get().id() \u003c\u003c std::endl;\n    });\n```\n\n\nHere is JavaScript running in Chrome call into C++ running on command line. Both are connected via a WAMP router, in this case [**Autobahn**|Python](https://github.com/crossbario/autobahn-python) based.\n\n![](doc/_static/cpp_from_js.png)\n\n* [Example C++ code](https://github.com/crossbario/autobahn-cpp/blob/master/examples/register2.cpp)\n* [Example JavaScript code](https://github.com/crossbario/autobahn-cpp/blob/master/examples/web/index.html)\n\n\n## Installation\n\nAutobahn C++ is a \"header-only\" library, which means there isn't anything to build (for the library itself), and the only thing to install are the header files.\n\nFor using Autobahn C++ in your project, clone the project, checkout a Git release tag (optional) and copy the library header files to your system (or project include directory):\n\n```console\ncd ~\ngit clone https://github.com/crossbario/autobahn-cpp.git\ncd autobahn-cpp\ncp -r autobahn/ /usr/local/include/\n```\n\n---\n\n\n## Examples\n\nThe Autobahn C++ repository contains a number of [examples](examples) that demonstrate all 4 basic patterns of using WAMP.\n\nThere are also examples for WAMP-CRA and Unix domain sockets.\n\n\n### Building dependencies\n\nThe instructions below were tested on Debian/Ubuntu and build and install the following:\n\n* Boost in `/opt/boost`\n* MsgPack-C in `/opt/msgpackc`\n* WebSocketC++ in `/opt/websocketpp`\n* AutobahnC++ in `/opt/autobahncpp`\n\n\u003e *Notes*\n\u003e\n\u003e * The library code is written in standard C++ 11. Target toolchains currently include **clang** and **gcc**. Support for MSVC is tracked on this [issue](https://github.com/crossbario/autobahn-cpp/issues/2).\n\u003e * While C++ 11 includes `std::future` in the standard library, this lacks continuations. `boost::future.then` allows attaching continuations to futures as outlined in the proposal [here](http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2013/n3634.pdf). This feature will come to standard C++, but probably not before 2017 (see [C++ Standardisation Roadmap](http://isocpp.org/std/status))\n\u003e * Support for `when_all` and `when_any` as described in above proposal depends on Boost 1.56 or higher.\n\u003e * The library and example programs were tested and developed with **clang 3.4**, **libc++** and **Boost trunk/1.56** on an Ubuntu 13.10 x86-64 bit system. It also works with **gcc 4.8**, **libstdc++** and **Boost trunk/1.56**. Your mileage with other versions of the former may vary, but we accept PRs;)\n\n---\n\n\n#### System libraries and cmake\n\nInstall some libs and build tools (these are for Debian/Ubuntu):\n\n```console\nsudo apt-get install -y libbz2-dev libssl-dev\n```\n\nInstall cmake\n\n```console\ncd ~\nwget https://cmake.org/files/v3.11/cmake-3.11.0-Linux-x86_64.sh\nchmod +x cmake-3.11.0-Linux-x86_64.sh\nsudo ./cmake-3.11.0-Linux-x86_64.sh --prefix=/opt\nsudo mv /opt/cmake-3.11.0-Linux-x86_64 /opt/cmake\n```\n\n---\n\n\n#### Clang (alternative)\n\nIf you want to work with Clang (rather than GCC), install [clang](http://clang.llvm.org/) and [libc++](http://libcxx.llvm.org/) (these are for Ubuntu):\n\n```console\nsudo apt-get install -y clang libc++1 libc++-dev\n```\n\nThen make Clang available:\n\n```console\n$ sudo update-alternatives --config c++\nThere are 2 choices for the alternative c++ (providing /usr/bin/c++).\n\n  Selection    Path                      Priority   Status\n------------------------------------------------------------\n* 0            /usr/bin/g++              20        auto mode\n  1            /usr/bin/clang++          10        manual mode\n  2            /usr/bin/clang++-libc++   5         manual mode\n  3            /usr/bin/g++              20        manual mode\n\nPress \u003center\u003e to keep the current choice[*], or type selection number: 1\nupdate-alternatives: using /usr/bin/clang++ to provide /usr/bin/c++ (c++) in manual mode\n\n```\n\n---\n\n\n#### Boost\n\nMost of the time, your distro's Boost libraries will be outdated (unless you're using Arch or Homebrew). Don't waste time with those. To build the latest Boost 1.66 (current release as of 2018/4) from sources.\n\nGet Boost:\n\n```console\ncd ~\nwget https://dl.bintray.com/boostorg/release/1.66.0/source/boost_1_66_0.tar.bz2\ntar xvjf boost_1_66_0.tar.bz2\ncd boost_1_66_0\n```\n\nThen, to build using the *GCC* toolchain:\n\n```console\n./bootstrap.sh --with-toolset=gcc\n./b2 toolset=gcc -j4\nsudo ./b2 install --prefix=/opt/boost\n```\n\n\u003e Note: The `-j 4` option will allow use of 4 CPU cores for building.\n\nInstead, to build using the *Clang* toolchain:\n\n```console\n./bootstrap.sh --with-toolset=clang\n./b2 toolset=clang -j4 \\\n    cxxflags=\"-stdlib=libc++\" linkflags=\"-stdlib=libc++\"\nsudo ./b2 install --prefix=/opt/boost\n```\n\nThen add the following to your `~/.profile` or `~/.bashrc`:\n\n```shell\nexport BOOST_ROOT=/opt/boost\nexport LD_LIBRARY_PATH=${BOOST_ROOT}/lib:${LD_LIBRARY_PATH}\n```\n\n---\n\n\n#### MsgPack-C\n\nGet [MsgPack-C](https://github.com/msgpack/msgpack-c) and install:\n\n```console\ncd ~\ngit clone https://github.com/msgpack/msgpack-c.git\ncd msgpack-c\ngit checkout cpp-1.4.2\ncmake -DMSGPACK_CXX11=ON -DCMAKE_INSTALL_PREFIX=/opt/msgpack .\nmake\nsudo make install\n```\n\u003e On FreeBSD, you need to `pkg install autotools` and invoke `gmake` instead of `make`.\n\nThen add the following to your `~/.profile` or `~/.bashrc`:\n\n```shell\nexport MSGPACK_ROOT=/opt/msgpack\nexport LD_LIBRARY_PATH=${MSGPACK_ROOT}/lib:${LD_LIBRARY_PATH}\n```\n\n---\n\n\n#### WebSocket++\n\nGet [WebSocket++](https://github.com/zaphoyd/websocketpp) and install:\n\n```console\ncd ~\ngit clone https://github.com/zaphoyd/websocketpp.git\ncd websocketpp\ncmake -DCMAKE_INSTALL_PREFIX=/opt/websocketpp .\nsudo make install\n```\n\nThen add the following to your `~/.profile` or `~/.bashrc`:\n\n```shell\nexport WEBSOCKETPP_ROOT=/opt/websocketpp\nexport LD_LIBRARY_PATH=${WEBSOCKETPP_ROOT}/lib:${LD_LIBRARY_PATH}\n```\n\n---\n\n\n### Building the examples\n\nNow that we have all the dependencies, to build the examples:\n\n```console\nmkdir build\ncd build\n/opt/cmake/bin/cmake ..\nmake -j4\nsudo make install\n```\n\nYou should see a clean build like in the following output:\n\n```console\noberstet@thinkpad-t430s:~/scm/crossbario/autobahn-cpp/build$ /opt/cmake/bin/cmake ..\n-- The C compiler identification is GNU 5.4.0\n-- The CXX compiler identification is GNU 5.4.0\n-- Check for working C compiler: /usr/bin/cc\n-- Check for working C compiler: /usr/bin/cc -- works\n-- Detecting C compiler ABI info\n-- Detecting C compiler ABI info - done\n-- Detecting C compile features\n-- Detecting C compile features - done\n-- Check for working CXX compiler: /usr/bin/c++\n-- Check for working CXX compiler: /usr/bin/c++ -- works\n-- Detecting CXX compiler ABI info\n-- Detecting CXX compiler ABI info - done\n-- Detecting CXX compile features\n-- Detecting CXX compile features - done\n-- Looking for pthread.h\n-- Looking for pthread.h - found\n-- Looking for pthread_create\n-- Looking for pthread_create - not found\n-- Looking for pthread_create in pthreads\n-- Looking for pthread_create in pthreads - not found\n-- Looking for pthread_create in pthread\n-- Looking for pthread_create in pthread - found\n-- Found Threads: TRUE\n-- Boost version: 1.66.0\n-- Found the following Boost libraries:\n--   program_options\n--   system\n--   thread\n--   random\n--   chrono\n--   date_time\n--   atomic\n-- Found OpenSSL: /usr/lib/x86_64-linux-gnu/libcrypto.so (found version \"1.0.2g\")\n-- AUTOBAHN_BUILD_EXAMPLES:  ON\n-- CMAKE_ROOT:               /opt/cmake/share/cmake-3.11\n-- Boost_INCLUDE_DIRS:       /opt/boost/include\n-- Boost_LIBRARIES:          /opt/boost/lib/libboost_program_options.so/opt/boost/lib/libboost_system.so/opt/boost/lib/libboost_thread.so/opt/boost/lib/libboost_random.so/opt/boost/lib/libboost_chrono.so/opt/boost/lib/libboost_date_time.so/opt/boost/lib/libboost_atomic.so\n-- Msgpack_INCLUDE_DIRS:     /opt/msgpack/include\n-- Msgpack_LIBRARIES:        /opt/msgpack/libs\n-- Websocketpp_INCLUDE_DIRS: /opt/websocketpp/include\n-- Websocketpp_LIBRARIES:    /opt/websocketpp/libs\n-- Configuring done\n-- Generating done\n-- Build files have been written to: /home/oberstet/scm/crossbario/autobahn-cpp/build\noberstet@thinkpad-t430s:~/scm/crossbario/autobahn-cpp/build$ make -j4\nScanning dependencies of target examples_parameters\n[  5%] Building CXX object examples/CMakeFiles/examples_parameters.dir/parameters.cpp.o\n[ 11%] Linking CXX static library libexamples_parameters.a\n[ 11%] Built target examples_parameters\nScanning dependencies of target callee\nScanning dependencies of target caller\nScanning dependencies of target provide_prefix\nScanning dependencies of target wampcra\n[ 16%] Building CXX object examples/CMakeFiles/caller.dir/caller.cpp.o\n[ 22%] Building CXX object examples/CMakeFiles/callee.dir/callee.cpp.o\n[ 27%] Building CXX object examples/CMakeFiles/provide_prefix.dir/callee.cpp.o\n[ 33%] Building CXX object examples/CMakeFiles/wampcra.dir/wampcra.cpp.o\n[ 38%] Linking CXX executable wampcra\n[ 38%] Built target wampcra\nScanning dependencies of target subscriber\n[ 44%] Linking CXX executable caller\n[ 50%] Building CXX object examples/CMakeFiles/subscriber.dir/subscriber.cpp.o\n[ 50%] Built target caller\nScanning dependencies of target uds\n[ 55%] Linking CXX executable callee\n[ 61%] Linking CXX executable provide_prefix\n[ 66%] Building CXX object examples/CMakeFiles/uds.dir/uds.cpp.o\n[ 66%] Built target callee\nScanning dependencies of target publisher\n[ 66%] Built target provide_prefix\nScanning dependencies of target websocket_callee\n[ 72%] Building CXX object examples/CMakeFiles/publisher.dir/publisher.cpp.o\n[ 77%] Building CXX object examples/CMakeFiles/websocket_callee.dir/websocket_callee.cpp.o\n[ 83%] Linking CXX executable subscriber\n[ 83%] Built target subscriber\n[ 88%] Linking CXX executable publisher\n[ 94%] Linking CXX executable uds\n[ 94%] Built target publisher\n[ 94%] Built target uds\n[100%] Linking CXX executable websocket_callee\n[100%] Built target websocket_callee\noberstet@thinkpad-t430s:~/scm/crossbario/autobahn-cpp/build$\n```\n\nAnd here are some details for one of the built example binaries:\n\n\n```console\noberstet@thinkpad-t430s:~/scm/crossbario/autobahn-cpp/build$ file examples/websocket_callee\nexamples/websocket_callee: ELF 64-bit LSB executable, x86-64, version 1 (GNU/Linux), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, for GNU/Linux 2.6.32, BuildID[sha1]=bfcab40b2350acd5869d913226723999cf0b822e, not stripped\noberstet@thinkpad-t430s:~/scm/crossbario/autobahn-cpp/build$ ldd examples/websocket_callee\n    linux-vdso.so.1 =\u003e  (0x00007fff44760000)\n    libboost_program_options.so.1.66.0 =\u003e /opt/boost/lib/libboost_program_options.so.1.66.0 (0x00007f8518873000)\n    libboost_system.so.1.66.0 =\u003e /opt/boost/lib/libboost_system.so.1.66.0 (0x00007f851866f000)\n    libboost_thread.so.1.66.0 =\u003e /opt/boost/lib/libboost_thread.so.1.66.0 (0x00007f8518446000)\n    libssl.so.1.0.0 =\u003e /lib/x86_64-linux-gnu/libssl.so.1.0.0 (0x00007f85181dd000)\n    libcrypto.so.1.0.0 =\u003e /lib/x86_64-linux-gnu/libcrypto.so.1.0.0 (0x00007f8517d99000)\n    libpthread.so.0 =\u003e /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f8517b7c000)\n    libstdc++.so.6 =\u003e /usr/lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007f85177fa000)\n    libgcc_s.so.1 =\u003e /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007f85175e4000)\n    libc.so.6 =\u003e /lib/x86_64-linux-gnu/libc.so.6 (0x00007f851721a000)\n    librt.so.1 =\u003e /lib/x86_64-linux-gnu/librt.so.1 (0x00007f8517012000)\n    libdl.so.2 =\u003e /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f8516e0e000)\n    /lib64/ld-linux-x86-64.so.2 (0x00007f8518af3000)\n    libm.so.6 =\u003e /lib/x86_64-linux-gnu/libm.so.6 (0x00007f8516b05000)\noberstet@thinkpad-t430s:~/scm/crossbario/autobahn-cpp/build$\n```\n\n---\n\n\n## Resources\n\n* [ASIO C++11 Examples](http://www.boost.org/doc/libs/1_55_0/doc/html/boost_asio/examples/cpp11_examples.html)\n* [Using Asio with C++11](http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2012/n3388.pdf)\n* [C++17: I See a Monad in Your Future! ](http://bartoszmilewski.com/2014/02/26/c17-i-see-a-monad-in-your-future/)\n* [Boost Thread](http://www.boost.org/doc/libs/1_55_0/doc/html/thread.html)\n* [Boost Issue: when_all](https://svn.boost.org/trac/boost/ticket/7447)\n* [Boost Issue. when_any](https://svn.boost.org/trac/boost/ticket/7446)\n* [Boost Issue: future fires twice](https://svn.boost.org/trac/boost/ticket/9711)\n* [Boost C++ 1y](http://www.boost.org/doc/libs/1_55_0/doc/html/thread/compliance.html#thread.compliance.cxx1y.async)\n* [Asynchronous API in C++ and the Continuation Monad](https://www.fpcomplete.com/blog/2012/06/asynchronous-api-in-c-and-the-continuation-monad)\n\n---\n\n\n## Closures Cheatsheet\n\n* `[]` Capture nothing (or, a scorched earth strategy?)\n* `[\u0026]` Capture any referenced variable by reference\n* `[=]` Capture any referenced variable by making a copy\n* `[=, \u0026foo]` Capture any referenced variable by making a copy, but capture variable `foo` by reference\n* `[bar]` Capture `bar` by making a copy; don't copy anything else\n* `[this]` Capture the this pointer of the enclosing class\n\n---\n\n\n## Release process\n\nTo push a new release of the toolchain Docker image:\n\n```console\ngit tag -a v20.8.1 -m \"tagged release\"\nsource docker/versions.sh\nmake build_gcc\nmake publish_gcc\n```\n\n\u003e Note: clang is currently broken.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcrossbario%2Fautobahn-cpp","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fcrossbario%2Fautobahn-cpp","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcrossbario%2Fautobahn-cpp/lists"}