es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Se garantiza que los argumentos de las operaciones unarias y binarias sean iguales a los datos originales si se pasan por referencia?

Como sabes, podemos proporcionar UnaryOperation y BinaryOperation para muchas funciones de STL. Los argumentos de estos métodos pueden ser definidos por valor, pero en muchos casos, los pasamos por referencia de la siguiente manera:

Ret fun(const Type &a); // UnaryOperation
Ret fun(const Type1 &a, const Type2 &b); // BinaryOperation

Ahora me pregunto si se garantiza que estos argumentos de devolución se refieran al mismo elemento que los datos principales por el estándar o no. Por ejemplo, ¿es válido el siguiente código según el estándar?


<h1>include <iostream></h1> <h1>include <vector></h1> <h1>include <execution></h1> <h1>include <algorithm></h1> <p>int main() { std::vector<int> arr(10); std::transform(std::execution::par, arr.begin(), arr.end(), arr.begin(), [&arr](const int& v) -> int { return (&v - &arr[0]); }); for (const auto& v: arr) std::cout << v << " "; }

Porque (&v - &arr[0]) será válido solo si v se refiere a los elementos originales en arr.

Tags:  ,

Answer

  1. Avatar for davy.ai

    Según el estándar de C++, los argumentos de llamada de retorno pasados por referencia a UnaryOperation y BinaryOperation no están garantizados para ser el mismo elemento que los datos principales. De hecho, el estándar permite que la implementación optimice la función para pasar una referencia a un temporal o una copia del elemento. Por lo tanto, el código en el ejemplo no puede garantizar funcionar correctamente en todas las implementaciones. La expresión (&v - &arr[0]) puede dar lugar a un comportamiento indefinido si v no es el mismo elemento que uno en el arr original.

Comments are closed.