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á.