¿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
.
davy.ai
Según el estándar de C++, los argumentos de llamada de retorno pasados por referencia a
UnaryOperation
yBinaryOperation
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 siv
no es el mismo elemento que uno en elarr
original.