Вот код.
// .
#include <stdio.h>
#include <memory>
#include <vector>
#define CAT_(a, b) a##b
#define CAT(a, b) CAT_(a, b)
#define REG(x) inline auto CAT(unused_name_, __LINE__ ) = tu_register(x)
#define LNE printf("%d", __LINE__ )
typedef void (*fp_required)( ) ;
using fvec_type = std::vector< fp_required > ;
static fvec_type fvec{};
inline bool tu_register( fp_required const & fp ){
printf("\nRegistered: %p" , fp ) ;
fvec.push_back( fp ) ;
return true ;
}
REG([]{ LNE; }) ; // 3 stateless lambdas
REG([]{ LNE; }) ;
REG([]{ LNE; }) ;
int main()
{
printf("\n\nRegistered %lu lambdas. %s\n", fvec.size(), (fvec.size() > 0 ? "Now calling them": ""));
for ( auto & fun : fvec ) {
printf("\nCalling lambda %p , rezult: " , fun);
fun() ;
}
return 0;
}
CLANG компилируется без предупреждений, но ничего не помещает в вектор?
https://wandbox.org/permlink/nkYjgqvr5QOprKEn
G ++ компилируется безпредупреждения и работает как положено.
https://wandbox.org/permlink/a6HB6xzavE8FOyOi
MSVC (последний VS2019, все в актуальном состоянии) тоже компилируется и работает без проблем.
Кто прав?