【发布时间】:2010-04-29 20:25:51
【问题描述】:
这是my previous question 的后续问题。
#include <functional>
int foo(void) {return 2;}
class bar {
public:
int operator() (void) {return 3;};
int something(int a) {return a;};
};
template <class C> auto func(C&& c) -> decltype(c()) { return c(); }
template <class C> int doit(C&& c) { return c();}
template <class C> void func_wrapper(C&& c) { func( std::bind(doit<C>, std::forward<C>(c)) ); }
int main(int argc, char* argv[])
{
// call with a function pointer
func(foo);
func_wrapper(foo); // error
// call with a member function
bar b;
func(b);
func_wrapper(b);
// call with a bind expression
func(std::bind(&bar::something, b, 42));
func_wrapper(std::bind(&bar::something, b, 42)); // error
// call with a lambda expression
func( [](void)->int {return 42;} );
func_wrapper( [](void)->int {return 42;} );
return 0;
}
我在 C++ 头文件深处遇到编译错误:
functional:1137: error: invalid initialization of reference of type ‘int (&)()’ from expression of type ‘int (*)()’functional:1137: error: conversion from ‘int’ to non-scalar type ‘std::_Bind<std::_Mem_fn<int (bar::*)(int)>(bar, int)>’ requested
func_wrapper(foo) 应该执行 func(doit(foo))。在实际代码中,它打包函数以供线程执行。 func 将由另一个线程执行的函数, doit 位于两者之间以检查未处理的异常并进行清理。但是 func_wrapper 中的附加绑定搞砸了……
【问题讨论】:
-
也许删除 C++ 标签?这是直接的 C++0x
-
保留两个标签。 C++0x 也是 C++。
-
试一试 PC-Lint(来自 www.gimpel.com)。它非常擅长提供比 Visual Studio 更好、更详细的错误消息。但是,它相当昂贵。