存储lambda的向量-CLANG与其他两个向量

问题描述 投票:0回答:1

这里是代码。

// .
#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,最新的),也可以编译并且没有问题。

谁是对的?

c++ visual-c++ g++ clang++
1个回答
1
投票

该代码应该

© www.soinside.com 2019 - 2024. All rights reserved.