代码:
#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:\开发\测试] > g++ foo.cpp -std=c++0x [d:\开发\测试] > _
Visual C++ 10.0 的结果:
[d:\开发\测试] > cl foo.cpp foo.cpp 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\xrefwrap(371) :请参阅对正在编译的类模板实例化 'std::tr1::_Call_wrapper' 的引用 和 [ _Callable=std::tr1::_Callable_obj ] C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\INCLUDE\xrefwrap(416) :请参阅对正在编译的类模板实例化 'std::tr1::_Refwrap_impl' 的引用 和 [ _Ty=const Foo ] foo.cpp(16) : 请参阅正在编译的类模板实例化 'std::tr1::reference_wrapper' 的引用 和 [ _Ty=const Foo ] C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\INCLUDE\xxcallwrap(8) : 错误 C2027: 使用未定义类型 'std:: tr1::_Result_of' 和 [ _Ty=const 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++ 不支持默认整数 C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\INCLUDE\xxcallwrap(10):错误 C4430:缺少类型说明符 - 假定为 int。注意:C++ 不支持默认整数 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' 的声明 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:\开发\测试] > _
我喜欢 Visual C++ 编译器 11 次告诉用户抽象类无法实例化的方式,只是为了强调这一点,以防用户不知道这一点。但是std::reference_wrapper
真的应该实例化这个类吗?(通过)引用的重点不是不需要实例化吗?
即,正如我强烈怀疑的那样,这是 Visual C++ 标准库实现中的错误吗?