【发布时间】:2011-01-26 09:15:21
【问题描述】:
我有这个代码:
#include <iostream>
#include <functional>
struct A
{
int operator()(int i) const {
std::cout << "F: " << i << std::endl;
return i + 1;
}
};
int main()
{
A a;
std::tr1::function<int(int)> f = std::tr1::ref(a);
std::cout << f(6) << std::endl;
}
目的是通过引用包装器传递函子对象,以避免无用的复制构造函数调用。 我希望得到以下输出:
F: 6
7
它可以在 GCC >= 4.4.0、Visual Studio 2008 和 boost 中正常工作,方法是将 std::tr1 命名空间替换为 boost。它仅不适用于新的 Visual Studio 2010 Express Beta 2 和 Release Candidate。
这个新的 C++ 功能在 vs2010 中是否存在错误? 还是代码有错误或误用?
【问题讨论】:
-
@litb:我认为 OP 在使用
std::tr1::ref模板类和 not VS2010 上的提升方面存在问题。 -
这里是vs2010的构建输出:pastebin.com/YQf4Qe8W
-
更多细节:包含
而不是 的相同代码适用于 vs2008,但 Steel 不适用于 vs2010。 vs2010 的 标头(及其依赖项)的内置实现似乎支持对 reference_wrapper 对象的函数调用调用......但它无法编译:(
标签: c++ visual-studio-2010 functional-programming c++11 functor