una significa que para los imagenes imagen como atributos atributo agregar c++ language-lawyer c++17 structured-bindings

c++ - para - que significa alt en una imagen



enlaces estructurados: cuando algo se parece a una referencia y se comporta de manera similar a una referencia, pero no es una referencia (2)

Ayer he visto una pregunta interesante aquí sobre SO sobre enlace estructurado.
Podemos resumirlo como sigue. Considere el siguiente código de ejemplo:

#include <tuple> #include <type_traits> int main() { auto tup = std::make_tuple(1, 2); auto & [ a, b ] = tup; // the following line won''t compile for a isn''t a reference // static_assert(std::is_reference_v<decltype(a)>); }

En este caso, decltype(a) es int (probablemente) debido a esta viñeta (borrador de trabajo):

si e es una expresión-id sin paréntesis que nombra un enlace estructurado, [...] decltype(e) es el tipo referenciado como se indica en la especificación de la declaración de enlace estructurado

Here hay un fragmento de wandbox proporcionado por @Curious en los comentarios para aquellos que estén interesados. Demuestra que en realidad no es una referencia, nada más.
Hasta el momento tan bueno para la pregunta original, OP preguntó por qué era int lugar de int & y el estándar dice que parecía una respuesta aceptable.

De todos modos, me gustaría saber por qué el comité decidió eso. Al final del día, a refiere a un elemento en la tupla y puedo modificar ese elemento a través de a . En otros términos, la declaración de a parece a la de una referencia, se comporta de manera similar a una referencia pero no es una referencia.

Puedo vivir con esto, pero me gustaría saber cuáles son las razones detrás de eso. ¿Por qué decltype(a) no puede ser simplemente int & ? ¿Hay alguna razón significativa que un profano pueda entender?


Este tema se ha tratado anteriormente (busque en la etiqueta de enlaces estructurados) y el comportamiento del que habla se aborda incluso en la segunda respuesta. Sin embargo, el fundamento se explica en la sección 3.5 de p0144r2 :

¿Debería extenderse la sintaxis para permitir const/& -calificar tipos de nombres individuales?

Por ejemplo:

auto [&x, const y, const& z] = f(); // NOT proposed

Pensamos que la respuesta debería ser no. Esta es una característica simple para almacenar un valor y vincular nombres a sus componentes, no para declarar múltiples variables. Permitir tal calificación sería un avance de características, extendiendo la característica a algo diferente, es decir, una forma de declarar múltiples variables.

Si queremos declarar múltiples variables, ya tenemos una manera de deletrearlas:

auto val = f(); T& x = get<0>(val); T2 const y = get<1>(val); T3 const& z = get<2>(val);


Escribí esto ayer :

decltype(x) , donde x es un enlace estructurado, nombra el tipo referenciado de ese enlace estructurado. En el caso similar a una tupla, este es el tipo devuelto por std::tuple_element , que puede no ser una referencia a pesar de que el enlace estructurado en sí es, de hecho, siempre una referencia en este caso. Esto efectivamente emula el comportamiento de enlace a una estructura cuyos miembros de datos no estáticos tienen los tipos devueltos por tuple_element , con la referencia del enlace en sí como un mero detalle de implementación.