Lambda语法MSVC和GCC之间不兼容

Nic*_*tin 3 c++ lambda gcc visual-c++ c++11

我在C++标头中创建了一个带有以下签名的方法:

template<class _Ty>
class x {
public:

    // ...

    template<class func_Ty>
    x *where(func_Ty &);
}
Run Code Online (Sandbox Code Playgroud)

我的代码期望func_Ty可以被调用(即函数指针,λ,或类重载operator()),采用类型的单个参数_Ty_Ty &,并返回一个boolbool &.我用这段代码调用函数(sx<int> *):

s->where([](int i){ return i % 2 == 0;});
Run Code Online (Sandbox Code Playgroud)

这在MSVC上编译很好,但是GCC给了我一个错误:

no matching function for call to ‘x<int>::where(main()::__lambda0)’
Run Code Online (Sandbox Code Playgroud)

如果我*在lambda前添加一个,GCC编译得很好,但是MSVC给了我一个错误:

error C2100: illegal indirection
Run Code Online (Sandbox Code Playgroud)

这是其中一个编译器中的错误吗?或者这些解决方案都可能是非标准的?无论哪种方式,是否有一些方法可以使相同的代码在两个编译器上工作?

bol*_*lov 10

据我所知,这是一个VS扩展,允许非const引用绑定到temporaries.该标准不允许这样做.

lambda是临时的,参数where是非const引用.

所以改变:

x *where(func_Ty &);
Run Code Online (Sandbox Code Playgroud)

x *where(const func_Ty &);
Run Code Online (Sandbox Code Playgroud)

要么

x *where(func_Ty);
Run Code Online (Sandbox Code Playgroud)

这个

template<class func_Ty>
x *where(func_Ty&&);
Run Code Online (Sandbox Code Playgroud)

也会工作,因为在这种情况下它是转发参考.