c++ - mapa - ¿Por qué std:: make_pair no devuelve un par? O lo hace?
string map c++ (1)
Usted declaró pair_of_ints
como constexpr
que implica const
:
Un especificador
constexpr
utilizado en una declaración de objeto declara que el objeto esconst
.
Entonces el tipo de pair_of_ints
es en realidad:
const std::pair<int, int>
typeid
ignora los calificadores cv, por lo que esta información no aparece en el nombre:
Si el tipo de la expresión o tipo-id es un tipo calificado por el cv, el resultado de la expresión
typeid
refiere a un objetostd::type_info
que representa el tipo no calificado por el cv.
Puede probar contra el tipo const-calificado, o eliminar el const-qualifier usando std::remove_const_t :
static_assert(std::is_same<decltype(pair_of_ints),
const std::pair<int, int>>::value);
static_assert(std::is_same<std::remove_const_t<decltype(pair_of_ints)>,
std::pair<int, int>>::value);
Mi comprobación de validez interna falló, así que la estoy ejecutando nuevamente en Stackoverflow.
El siguiente código:
#include <iostream>
#include <typeinfo>
#include <utility>
int main()
{
constexpr auto pair_of_ints = std::make_pair(1, 2);
std::cerr << typeid(pair_of_ints).name();
//static_assert(std::is_same<decltype(pair_of_ints), std::pair<int, int>>::value, "WTF");
}
produce el nombre del símbolo mutilado para std::__1::pair<int, int>
en mi sistema (XCode Clang 8.x).
Si luego static_assert
el static_assert
, falla. No tengo ni idea de porqué. ¿Cómo puedo hacer este trabajo? Tengo una función que devuelve un par o tupla dependiendo de los argumentos que se le pasaron y me gustaría verificar que realmente devuelva un par o tupla en los casos correctos.