1

std::function()在我的代码中使用 C++11 和 VS2010。这是我的代码。

function<string (string)> myfunc = 3;
myfunc(string());

很明显,代码不正确,因为myfunc对象没有正确初始化。该myfunc对象应由function<string (string)>整数类型以外的对象赋值。当运行到代码时myfunc(string());std::function对象抛出bad_function_call()并得到错误。

但是,让我困惑的是为什么 C++11 在编译时不检查类型?这很奇怪,因为缺少类型检查会让程序员很容易意外地弄乱代码,直到运行到相应的错误行。

所以我想问一下:std::function()VS2010中编译C++11代码时是否检查类型?如果没有,有什么办法可以解决这个问题吗?

4

1 回答 1

2

看起来这是 MS 实现中的一个 hack,std::function以允许以下操作:

function<string (string)> myfunc = NULL;

这是我可以在 MS 的<functional>标头实现中找到的一段代码:

#if defined(_NATIVE_NULLPTR_SUPPORTED) \
    && !defined(_DO_NOT_USE_NULLPTR_IN_STL)
    function(int)
    {   // construct empty function wrapper from null pointer
        this->_Reset();
    }
#endif /* defined(_NATIVE_NULLPTR_SUPPORTED) etc. */

所以看起来这个构造函数是根据用户想要的标准一致性级别有条件地启用的。

但是,C++11 标准库规范中没有这样的构造函数(参见第 20.8.11.2.1 段)。

于 2013-05-02T19:16:36.580 回答