вектор, хранящий лямбды - CLANG против двух других - PullRequest
1 голос
/ 26 октября 2019

Вот код.

// .
#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, все в актуальном состоянии) тоже компилируется и работает без проблем.

Кто прав?

1 Ответ

1 голос
/ 26 октября 2019

Этот код должен работать, а в Clang 8.0.0 - работает. Похоже, что после этого он сломался и не работает ни в 9.0.0, ни в 10.0.0 в Wandbox.

...