当我使用libc ++运行此代码时:
struct foo
{
foo(int x) : x(x)
{}
int x;
};
int main()
{
const auto select_x = std::mem_fn(&foo::x);
foo f(1);
printf("%i\n", select_x(f));
}
我收到这样的错误:
mem_fn.cpp:16:20: error: no matching function for call to object of type
'const std::__1::__mem_fn<int foo::*>'
printf("%i\n", select_x(f));
^~~~~~~~
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/functional:1224:11: note:
candidate function not viable: 'this' argument has type 'const
std::__1::__mem_fn<int foo::*>', but method is not marked const
operator() (_ArgTypes&&... __args)
^
似乎libc ++缺少const
重载。它使用libstdc ++。这是libc ++中的错误吗?或者标准是否需要const
重载?
答案 0 :(得分:3)
我没有看到标准指定mem_fn
返回的包装器的可恢复性的任何内容。来自[func.memfn](引用N4140):
template<class R, class T> unspecified mem_fn(R T::* pm);
1 返回:一个简单的调用包装器(20.9.1)
fn
,这样 表达式fn(t, a2, ..., aN)
相当于INVOKE (pm, t, a2, ..., aN)
(20.9.2)。fn
应具有嵌套类型result_type
是pm
是指针的返回类型pm
的同义词 成员函数。2简单的调用包装器应定义两个名为的嵌套类型 argument_type和result_type作为
cv T*
和Ret
的同义词, 当pm是指向成员函数的指针时 cv-qualifiercv
并且没有参数,其中Ret
是pm
返回类型。3简单的调用包装器应定义三种嵌套类型 名为
first_argument_type
,second_argument_type
和result_type
分别为cv T*
,T1
和Ret
的同义词, 当pm
是指向具有cv-qualifiercv
的成员函数的指针时 取一个T1
类型的参数,其中Ret
是pm
的返回类型。4 引发:没什么。
对[func.def]的引用(虽然简单的调用包装实际上是在[func.require]中定义的)同样没有说明。这几乎只能保证它返回的任何内容都可以直接使用。
作为一个执行质量问题,我认为没有理由为什么包装器不应该是可循环的,看起来这实际上已经修复over a year ago。您可能想尝试更新XCode以查看是否可以选择更新版本的库。