c++ - 使用指向成员的指针读取 cons 对象字段的值

标签 c++ constants pointer-to-member

我正在尝试使用指向成员的指针获得对对象字段的只读访问权限,但是我收到“访问冲突读取位置...”错误。

template<typename X, typename Y>
class a
{
public:
    a(Y X::*field): f([&](const X &x) { return x.*field; }) {} // error
    a(Y (X::*method)() const): f([=](const X &x) { return (x.*method)(); }) {}
    a(std::function<Y(const X &)> f): f(f) {}

    Y operator()(const X &x) const { return f(x); }

private:
    std::function<Y(const X &)> f;
};

class X
{
public:
    X(): x(1) {}
    int x;
    int f() const { return x + 1; }
};

int main()
{
    X x;
    a<X const, int> a1(&X::x);
    a<X, int> a2(&X::f);
    a<X, int> a3([](const X &x) { return x.f() + x.x; });
    std::cout << a1(x) << a2(x) << a3(x) << std::endl;
    return 0;
}

我尝试将 const 限定符添加到字段定义中,但这没有帮助。

最佳答案

问题在于您在 lambda 中捕获事物的方式。

a(Y X::*field): f([&](const X &x) { return x.*field; }) {}

您使用对 field 的引用,它仅在构造函数中有效。当构造函数结束时,您有一个悬空引用。

修复的方法是复制参数:

a(Y X::*field): f([=](const X &x) { return x.*field; }) {}

a3 的创建失败,因为您没有合适的构造函数。

关于c++ - 使用指向成员的指针读取 cons 对象字段的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19934348/

相关文章:

c++ - 跨 C++ 模块传递指向成员函数的指针

c++ - Crazy C++ 模板 - 访问类的各个属性的模板

c++ - "State pattern"与 "one member function per state"?

c++ - std::vector<T>::clear() 是否调用内容的析构函数?

c++ - 来自 OSX 应用程序的 Mkdir

ios - 从一个函数引用另一个函数中的常量

C++,指向同一位置的两个指针如何保存不同的值

c++ - GlTexSubImage2D 慢并且使用 4% 的 CPU

c++ - 在函数 B 中释放函数 A 的运行时内存

javascript - getFiles 和 getFolders 总是只返回一个文件/文件夹