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

Posted

技术标签:

【中文标题】std::reference_wrapper 中的 Visual C++ 10.0 错误?【英文标题】:Visual C++ 10.0 bug in std::reference_wrapper? 【发布时间】:2012-03-19 00:36:47 【问题描述】:

代码:

#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 真的应该实例化这个类吗?对 not 的引用(传递)的意义不是很大吗?

也就是说,我强烈怀疑,这是否是 Visual C++ 标准库实现中的错误?

【问题讨论】:

我向微软提交了bug report。 您不应该使用 ref 辅助函数创建 reference_wrapper 吗? 微软对此的回答是:“我们已经修复了它,修复将在 VC11 RTM 中可用。(但是,修复没有进入 VC11 Beta。)”想知道会发生什么使用 VC10,是否会推出另一个服务包? 你应该回答这个问题,即使它是你的,并接受它。不是为了代表,而是为了完成。答案看起来更像是答案而不是评论(我想知道为什么...... duh) @DavidRodríguez-dribeas,我想知道为什么。像 SO once 这样的网站是沟通的渠道。当它们施加太多开销、太多麻烦时,人们就会停止使用它们。你能想象有足够聪明的人从中受益,需要“帮助”才能得到一个“答案”吗?我想不是。 :-) 【参考方案1】:

由问题作者解决。它是 Visual C++ 10.0 中的 bug,据说在 VC 的下一个主要版本中已修复。

【讨论】:

以上是关于std::reference_wrapper 中的 Visual C++ 10.0 错误?的主要内容,如果未能解决你的问题,请参考以下文章

展开 std::reference_wrapper 的成本

是否可以仅从 std::any 使用 std::reference_wrapper 创建 std::any?

非模板 std::reference_wrapper 赋值运算符和模板构造函数

我可以实例化一个 std::reference_wrapper<T> ,其中 T 是不完整的类型吗?

c++11 std::ref std::cref

多态对象的数组