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 &
,并返回一个bool
或bool &
.我用这段代码调用函数(s
是x<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)
也会工作,因为在这种情况下它是转发参考.
归档时间: |
|
查看次数: |
214 次 |
最近记录: |