std::reference_wrapper中的Visual C++10.0错误

Visual C++ 10.0 bug in std::reference_wrapper?

本文关键字:C++10 错误 Visual wrapper reference std 中的      更新时间:2023-10-16

代码:

#include <functional>
struct Foo
{
    virtual void mf() = 0;
};
struct Bar: Foo
{
    virtual void mf() {}
};
int main()
{
    Bar o;
    std::reference_wrapper<Foo const> wrapper( o );
}

MinGW g++4.6.1:的结果

[d:\dev\test]>g++foo.cpp-std=c++0x[d:\dev\test]>_

Visual C++10.0的结果:

[d:\dev\test]>cl foo.cppfoo.cppC: \Program Files(x86)\Microsoft Visual Studio 10.0\VC\INCLUDE\xxcallwrap(8):错误C2259:"Foo":无法实例化抽象类由于以下成员:"void Foo::mf(void)":是抽象的foo.cpp(5):请参阅"foo::mf"的声明C: \Program Files(x86)\Microsoft Visual Studio 10.0\VC\INCLUDE\xrefrap(371):请参阅对正在编译的类模板实例化"std::tr1::_Call_wrapper"的引用具有[_可调用=std::tr1::_Callable_obj]C: \Program Files(x86)\Microsoft Visual Studio 10.0\VC\INCLUDE\xrefwrap(416):请参阅对正在编译的类模板实例化"std::tr1::_Refwrap_impl"的引用具有[_Ty=常量Foo]foo.cpp(16):请参阅对正在编译的类模板实例化"std::tr1::reference_wrapper"的引用具有[_Ty=常量Foo]C: \Program Files(x86)\Microsoft Visual Studio 10.0\VC\INCLUDE\xxcallwrap(8):错误C2027:使用未定义的类型"std::"tr1::_Result_of'具有[_Ty=常量Foo(无效)]C: \Program Files(x86)\Microsoft Visual Studio 10.0\VC\INCLUDE\xxcallwrap(9):错误C2143:语法错误:缺少";"在"("之前C: \Program Files(x86)\Microsoft Visual Studio 10.0\VC\INCLUDE\xxcallwrap(9):错误C4430:缺少类型说明符-假定为int。注意:C++不支持默认的intC: \Program Files(x86)\Microsoft Visual Studio 10.0\VC\INCLUDE\xxcallwrap(10):错误C4430:缺少类型说明符-假定为int。注意:C++不支持默认的intC: \Program Files(x86)\Microsoft Visual Studio 10.0\VC\INCLUDE\xxcallwrap(8):错误C2259:"Foo":无法实例化抽象类由于以下成员:"void Foo::mf(void)":是抽象的foo.cpp(5):请参阅"foo::mf"的声明C: \Program Files(x86)\Microsoft Visual Studio 10.0\VC\INCLUDE\xxcallwrap(8):错误C2259:"Foo":无法实例化抽象类由于以下成员:"void Foo::mf(void)":是抽象的foo.cpp(5):请参阅"foo::mf"的声明C: \Program Files(x86)\Microsoft Visual Studio 10.0\VC\INCLUDE\xxcallwrap(8):错误C2259:"Foo":无法实例化抽象类由于以下成员:"void Foo::mf(void)":是抽象的foo.cpp(5):请参阅"foo::mf"的声明C: \Program Files(x86)\Microsoft Visual Studio 10.0\VC\INCLUDE\xxcallwrap(8):错误C2259:"Foo":无法实例化抽象类由于以下成员:"void Foo::mf(void)":是抽象的foo.cpp(5):请参阅"foo::mf"的声明C: \Program Files(x86)\Microsoft Visual Studio 10.0\VC\INCLUDE\xxcallwrap(8):错误C2259:"Foo":无法实例化抽象类由于以下成员:"void Foo::mf(void)":是抽象的foo.cpp(5):请参阅"foo::mf"的声明C: \Program Files(x86)\Microsoft Visual Studio 10.0\VC\INCLUDE\xxcallwrap(8):错误C2259:"Foo":无法实例化抽象类由于以下成员:"void Foo::mf(void)":是抽象的foo.cpp(5):请参阅"foo::mf"的声明C: \Program Files(x86)\Microsoft Visual Studio 10.0\VC\INCLUDE\xxcallwrap(8):错误C2259:"Foo":无法实例化抽象类由于以下成员:"void Foo::mf(void)":是抽象的foo.cpp(5):请参阅"foo::mf"的声明C: \Program Files(x86)\Microsoft Visual Studio 10.0\VC\INCLUDE\xxcallwrap(8):错误C2259:"Foo":无法实例化抽象类由于以下成员:"void Foo::mf(void)":是抽象的foo.cpp(5):请参阅"foo::mf"的声明C: \Program Files(x86)\Microsoft Visual Studio 10.0\VC\INCLUDE\xxcallwrap(8):错误C2259:"Foo":无法实例化抽象类由于以下成员:"void Foo::mf(void)":是抽象的foo.cpp(5):请参阅"foo::mf"的声明C: \Program Files(x86)\Microsoft Visual Studio 10.0\VC\INCLUDE\xxcallwrap(8):错误C2259:"Foo":无法实例化抽象类由于以下成员:"void Foo::mf(void)":是抽象的foo.cpp(5):请参阅"foo::mf"的声明[d:\dev\test]>_

我喜欢Visual C++编译器11次告诉用户抽象类不能被实例化的方式,只是为了强调这一点,比如,如果用户没有意识到这一点。但是std::reference_wrapper真的应该实例化类吗?对的引用(顺便提及)不需要实例化吗?

也就是说,正如我强烈怀疑的那样,这是Visual C++标准库实现中的一个错误吗?

由问题作者解决。这是Visual C++10.0中的一个错误,应该在下一个主要版本的VC中修复。

相关文章: