Почему QMetaObject::invokeMethod не изменяет переменную в QGenericReturnArgument если Q_INVOKABLE-функция возвращает ссылку?

155
24 ноября 2018, 07:10

Работающий код, функция testValue() возвращает копию значения:

class Node : public QObject
{
    Q_OBJECT
public:
//some code
Q_INVOKABLE int testValue() {return _test;}
//some code
private:
int _test = 5;
//some code
};

Вызываем фнкцию testValue через invokeMethod:

int testValue;
world->metaObject()->invokeMethod(world, "testValue", Q_RETURN_ARG(int, testValue));
qDebug() << "TEST VALUE:" << testValue; //5

Все хорошо, видим на экране 5

Тот же код, но функция testValue возвращает ссылку:

class Node : public QObject
{
    Q_OBJECT
public:
//some code
Q_INVOKABLE int &testValue() {return _test;}
//some code
private:
int _test = 5;
//some code
};

вызываем invokeMethod:

int testValue;
world->metaObject()->invokeMethod(world, "testValue", Q_RETURN_ARG(int, testValue));
qDebug() << "TEST VALUE:" << testValue; //?

значение testValue не меняется и вывод зависит от платформы

Так не работает тоже:

int testValue;
world->metaObject()->invokeMethod(world, "testValue", Q_RETURN_ARG(int&, testValue));
qDebug() << "TEST VALUE:" << testValue; //?

Определим тип intamp, но тоже не работает:

typedef int& intamp;
int testValue;
world->metaObject()->invokeMethod(world, "testValue", Q_RETURN_ARG(intamp, testValue));
qDebug() << "TEST VALUE:" << testValue;

PS Может понадобиться, если функция возвращает ссылку на массивный объект, здесь привел более простой и академический пример, чтобы понять, почему нельзя использовать ссылку в Q_RETURN_ARG, не нашел прямого упоминания об этом в документации QT

READ ALSO
в чем отличие виртуальной функции от шаблонной функции?

в чем отличие виртуальной функции от шаблонной функции?

Подскажите пожалуйста, чем отличается виртуальная функция от шаблонной функции?

150
Как узнать формат даты?

Как узнать формат даты?

Как узнать формат даты, если он неизвестен заранее?

149
Вопрос про наследование

Вопрос про наследование

Здравствуйте, код выдает 0 9Подскажите пожалуйста, почему если поменять модификатор метода initialize() в классе А на private, то получаем 6 9 ? Инициализация...

156