Безопасно или даже возможно использовать ссылку на объект, который возвращается функцией (членом)? - PullRequest
0 голосов
/ 10 февраля 2019

У меня есть класс, хранящий набор значений, которые могут изменяться во всей программе, и функция-член, которая вычисляет и возвращает матрицу на основе этих значений.

У меня также есть функция, которая требует constуказатель на первый float такой матрицы.

Я не хочу вручную создавать локальную матрицу где-нибудь.Вместо этого я хочу одновременно обновить и передать его в указанную функцию прямо из класса.

Итак, вместо этого:

glm::mat4 matrix = myClass.calculateMatrix();

functionThatneedsMatrix(&matrix [0][0]);

могу ли я это сделать?

functionThatneedsMatrix(&myClass.calculateMatrix()[0][0]);

И если да, то каков охват этой матрицы?

1 Ответ

0 голосов
/ 10 февраля 2019

Временный ресурс действует до конца полного выражения, в котором он был создан, поэтому в вашем случае значение prvalue, возвращаемое из calculateMatrix, сохраняется до ; (после возврата functionThatneedsMatrix).Так что да, безопасно использовать его таким образом.

functionThatneedsMatrix(&myClass.calculateMatrix()[0][0]) ;
//                                                        ^
//                                                        |
//                                                temporary lifetime ends here,
//                                                after functionThatneedsMatrix returns

Возможный случай UB - это, если functionThatneedsMatrix возвращает или сохраняет этот указатель так, чтобы он был доступен после завершения вызова функции:

int* p = functionThatneedsMatrix(&myClass.calculateMatrix()[0][0]) ;
//       ^
//       if it returns the pointer value it received as parameter

// p is a dangling pointer at this time

int a = *p; // Undefined behavior
...