J'ai ce problème de conversion avec ce code en C++ 11 standard:C++ 11: conversion const int * int * * en utilisant unordered_set :: push
#include<unordered_set>
struct B
{
int x, y;
};
class A
{
struct hash
{
std::size_t operator()(int* const a) const
{
return std::hash<int>()(*a);
}
};
struct equal_to
{
std::size_t operator()(int* const a, int* const b) const
{
return std::equal_to<int>()(*a, *b);
}
};
private:
std::unordered_set< int*, hash, equal_to > set;
public:
void push(const B& b)
{
set.insert(&b.x);
}
};
Quelqu'un sait pourquoi est-ce? Je peux résoudre le problème en supprimant le modificateur "const" dans l'argument de "push". Mais je ne le veux pas car l'argument "b" n'est pas modifié.
Edit .: Ma simplification du code a produit une adresse non référencée. J'ai fait une structure B l'enlever.
Ce n'est pas C11. –
Vote pour rouvrir. Le problème est dans 'set.insert (& a)', où 'a' a le type' const int & '. L'adresse de 'a' a le type" pointer to const int ", mais l'objet set cherche un" pointer to (modifiable) int ". Ce genre de confusion const est assez commun et mérite une réponse. –
Non lié à votre question, mais vous stockez l'adresse d'un objet qui peut être un objet temporaire dans votre ensemble. Une fois que le 'a' qui a été passé à la méthode' push' est hors de portée, l'adresse est invalide et peut entraîner une corruption du tas ou des applications plus tard si elle est référencée (par exemple votre méthode 'equal_to'). – pstrjds