auto f = bind(dist<>,gen) 在成员声明C++失败。未被识别为函数

auto f = bind(dist<>,gen) fails in C++ member declaration. Not recognized as a function

本文关键字:失败 C++ 声明 成员 函数 识别 gen bind dist lt auto      更新时间:2023-10-16

Stroustrup的"C++编程语言"中的一些示例代码无法使用GCC 6.4.1 std=C11进行编译。

#include <random>
#include <functional>
// From Stroustrup C++11 4th Edition section 40.7
// error: non-static data member declared ‘auto’
class Rand_int {
public:    // public: Added to text from original
    Rand_int(int lo, int hi) : p{lo,hi} { }
    int operator()() const { return r(); }
private:
    std::uniform_int_distribution<>::param_type p;
    auto r = std::bind(std::uniform_int_distribution<>{p},std::default_random_engine{});
};

编译器失败,并显示"错误:非静态数据成员声明为'auto'"。因此,它将此定义视为数据成员的定义,而不是成员函数的定义。从绑定返回应该允许声明 auto。

Stroustrup 的这句话紧跟在上面的代码之后:"我使用发行版的标准param_type别名 (§40.7.3( 存储参数,以便我可以使用自动,以避免必须命名绑定((的结果。

default_random_engine是 stdlib 模板函数的typedef。如何解决?

因此,它将此定义视为数据成员的定义,而不是成员函数的定义。

此方法有几个问题:

  • std::bind()返回一个"函数对象",又名函子,而不是函数

来自 std::bind 文档:

未指定类型 T 的函数对象,其 std::is_bind_expression::value == true

  • 即使你把一个函数放在赋值的右侧,它也不会使它成为一个函数

例如:

 void foobar();
 auto r = foobar;

这将使r成为指向类型为 void (*)(); 而不是函数的函数foobar()的指针。无法以这种方式声明方法或独立函数。事实上,在稍后的代码中,您可以像使用r();函数一样调用它,但这并不能使它成为函数。