是否需要std :: mem_fn返回的函数对象具有const重载

时间:2015-02-15 16:22:32

标签: c++ c++11 clang libc++

当我使用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重载?

1 个答案:

答案 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-qualifier cv并且没有参数,其中Retpm   返回类型。

     

3简单的调用包装器应定义三种嵌套类型   名为first_argument_typesecond_argument_type和   result_type分别为cv T*T1Ret的同义词,   当pm是指向具有cv-qualifier cv的成员函数的指针时   取一个T1类型的参数,其中Retpm的返回类型。

     

4 引发:没什么。

对[func.def]的引用(虽然简单的调用包装实际上是在[func.require]中定义的)同样没有说明。这几乎只能保证它返回的任何内容都可以直接使用。

作为一个执行质量问题,我认为没有理由为什么包装器不应该是可循环的,看起来这实际上已经修复over a year ago。您可能想尝试更新XCode以查看是否可以选择更新版本的库。