tutorial smart remix programador online español curso c++ c++11 tuples initializer-list list-initialization

c++ - remix - smart contracts ethereum



¿Por qué la inicialización={} no funciona para la tupla? (2)

Además de respuesta correcta (que he votado más), quería agregar un poco más de información ...

Post-C ++ 14, el estándar ha sido cambiado para permitir:

tuple<int, int> t2={1, 2};

Para compilar y tener la semántica esperada. La propuesta que hace esto es N4387 . Esto también permitirá construcciones tales como:

tuple<int, int> foo() { return {1, 2}; }

Solo lo permite si todas las T de la tuple son contratables implícitamente de todos los argumentos.

Como una extensión no conforme, libc ++ ya implementa este comportamiento.

Para mí, un pair es solo el caso especial de una tuple , pero lo siguiente me sorprende:

pair<int, int> p1(1, 2); // ok tuple<int, int> t1(1, 2); // ok pair<int, int> p2={1, 2}; // ok tuple<int, int> t2={1, 2}; // compile error

¿Por qué hay una diferencia cuando usamos {} para inicializar la tuple ?

Intenté incluso g++ -std=c++1y pero todavía g++ -std=c++1y error:

a.cc: In function ''int main()'': a.cc:9:29: error: converting to ''std::tuple<int, int>'' from initializer list would use explicit constructor ''constexpr std::tuple<_T1, _T2>::tuple(_U1&&, _U2&&) [with _U1 = int; _U2 = int; <template-parameter-2-3> = void; _T1 = int; _T2 = int]'' tuple<int, int> t2={1, 2}; ^


El constructor de tuple que intenta llamar es explicit , por lo que la inicialización de la lista de copias fallará . El constructor de pair correspondiente no es explicit .

Cambia tu código a

tuple<int, int> t2{1, 2};

y se compilará.