Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/visual-studio-2010/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ VisualStudio2010和std::function_C++_Visual Studio 2010_Functional Programming_C++11_Functor - Fatal编程技术网

C++ VisualStudio2010和std::function

C++ VisualStudio2010和std::function,c++,visual-studio-2010,functional-programming,c++11,functor,C++,Visual Studio 2010,Functional Programming,C++11,Functor,我有以下代码: #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&l

我有以下代码:

#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;
}
它可以在GCC>=4.4.0、VisualStudio2008和boost中正常工作,方法是用boost替换std::tr1名称空间。它只适用于新的VisualStudio2010 Express Beta 2和候选版本

<>这是新的C++特性在VS2010中被窃听吗?
或者代码中有错误或误用?

我想我找到了原因。这是TR1
3.4/2
关于
result\u of::type
的说明,用于确定
reference\u wrapper::operator()的返回类型:

实现可以通过产生给定类型的表达式f(t1,t2,…,tN)的确切类型的任何方式来确定类型成员。[注:目的是允许实现使用特殊的编译器挂钩-结束注]

然后是第3段:

如果F不是标准库定义的函数对象,并且如果实现无法确定表达式F(t1、t2、…、tN)的类型,或者表达式格式不正确,则实现应使用以下过程来确定类型成员:

  • 如果F可能是cv限定类类型,没有名为
    result\u type
    的成员,或者如果
    typename F::result\u type
    不是类型:
    • 如果N=0(无参数),则类型为void
    • 如果N>0,则类型为
      typename F::template result::type
错误消息是尝试这些回退的产物。为
result\u type
int
提供一个typedef,我认为它应该可以工作。请注意,在
C++0x
中,这是不同的。它不依赖于
result\u type
result
模板,因为它可以使用
decltype

如果MSVC10在C++0x模式下使用
失败,我会说它闻起来像个bug。但也许其他人知道发生了什么。如果标头选择采用
decltype
方式而不是
::result\u type
,则它可以(但不保证)在C++0x模式下使用
。我会键入def
result\u type
——这样我认为无论是使用
tr1
头还是
c++0x
头,它都应该始终有效



还请注意,
boost::tr1
在其文档中表示它不支持函数调用操作符(但它只支持到
T&
的隐式转换)

我在这里遇到了类似的问题:


为了让它在MSVC10上编译,我必须从std::一元函数派生出我的函数对象

@litb:我认为OP在使用
std::tr1::ref
模板类和不在VS2010上使用boost方面存在问题。以下是VS2010的构建输出:更多详细信息:包含的相同代码不适用于vs2008,但steel不适用于VS2010。vs2010标头(及其DEP)的内置实现似乎支持引用包装器对象的函数调用调用。。。但是它无法编译:(是的,这解决了问题:D对于vs2010来说,与之前的2008版本相比,这种回归非常遗憾……最近的草案严格要求编译器能够自动识别返回类型。第20.7.4段
F: 6
7