Использование указателя на член для чтения значения поля объекта cons
Я пытаюсь получить доступ только для чтения к полю объекта, используя указатель на член, однако я получаю сообщение об ошибке "Access чтения read location ...".
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;
}
Я пытался добавить константный квалификатор в определение поля, но это не помогло.
1 ответ
Решение
Проблема в том, как вы фиксируете вещи в своей лямбде.
a(Y X::*field): f([&](const X &x) { return x.*field; }) {}
Вы используете ссылку на field
, который действителен только в конструкторе. Когда конструктор заканчивается, у вас есть свисающая ссылка.
Способ исправить это скопировать параметры:
a(Y X::*field): f([=](const X &x) { return x.*field; }) {}
Создание a3
не удается, потому что у вас нет соответствующего конструктора.