gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 05:07:33 25 4
gpt4 key购买 nike

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’”。因此它将此定义视为数据成员而不是成员函数的定义。 bind 的返回应该允许声明 auto。

Stroustrup 的这句话紧接在上面的代码之后“我使用分布的标准 param_type 别名 (§40.7.3) 存储参数,以便我可以使用auto 以避免必须命名 bind() 的结果。”

default_random_engine 是 stdlib 模板函数的 typedef。如何修复?

最佳答案

Hence it sees this definition as that of a data member and not a member function.

这种方法有几个问题:

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

来自 std::bind文档:

A function object of unspecified type T, for which std::is_bind_expression::value == true

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

例如:

 void foobar();
auto r = foobar;

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

关于c++ - auto f = bind(dist<>,gen) 在 C++ 成员声明中失败。不被识别为函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47353796/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com