Dj *_*spa 11 c++ functional-programming visual-studio-2010 functor c++11
我有这个代码:
#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;
}
Run Code Online (Sandbox Code Playgroud)
目的是通过reference_wrapper传递functor对象,以避免无用的复制costructor调用.我期待以下输出:
F: 6
7
Run Code Online (Sandbox Code Playgroud)
它适用于GCC> = 4.4.0,Visual Studio 2008,并通过用boost替换std :: tr1命名空间来提升.它仅适用于新的Visual Studio 2010 Express Beta 2和Release Candidate.
这个新的C++功能在vs2010中有漏洞吗?或者代码中有一些错误或误用?
Joh*_*itb 11
我想我找到了原因.这就是TR1 3.4/2所说的result_of<T(A1, A2, ..., AN)>::type,用于确定返回类型reference_wrapper<T>::operator():
实现可以通过任何方式确定类型成员,该方法产生给定类型的表达式f(t1,t2,...,tN)的确切类型.[注意:目的是允许实现使用特殊的编译器钩子 - 结束注释]
然后第3段:
如果F不是标准库定义的函数对象,并且如果实现无法确定表达式f(t1,t2,...,tN)的类型或表达式是否格式错误,则实现应使用以下过程确定类型成员:
- 如果F是可能是cv限定的类类型,没有成员命名
result_type或者typename F::result_type不是类型:
- 如果N = 0(无参数),则type为void.
- 如果N> 0,则键入
typename F::template result<F(T1, T2,..., TN)>::type
错误消息是尝试这些后备的人工制品.我认为,为result_typeto 提供一个typedef int,它应该可以工作.请注意C++0x,这是不同的.它不依赖于result_type或result模板,因为它可以使用decltype.
如果<functional>它在C++ 0x模式下使用MSVC10失败,我会说它闻起来像一个bug.但也许别人知道发生了什么.它可能(但不保证)<tr1/functional>在C++ 0x模式下工作,如果该标题选择采取的decltype方式而不是::result_type.我会typedef result_type- 我认为它应该始终工作,无论tr1是使用c++0x标头还是标头.
另请注意,boost::tr1在其文档中说它不支持函数调用操作符(但它只支持隐式转换T&).
| 归档时间: |
|
| 查看次数: |
16999 次 |
| 最近记录: |