#include <functional>
#include <map>
#include <string>
#include <iostream>
class X
{
public:
X()
{
std::cout << "Ctor\n";
}
private:
typedef std::map<std::string, std::function<void()>> ValidatorType;
const ValidatorType m_validators = ValidatorType
{
{
"some-string",
[]()
{
// validation code
std::cout << "Validating...\n";
}
}
};
};
int main()
{
std::cout << "Start...\n";
X x;
std::cout << "Complete...\n";
return 0;
}
Le code ci-dessus construit et fonctionne avec succès en mode débogage et la libération sur OS X en utilisant Xcode 7.2.1 et 7.0.2 Clang.Exception en mode débogage lorsque la variable membre const initialisés dans la déclaration de classe
Il peut également être généré et exécuté avec succès en mode édition sur Windows 7 à l'aide de Visual Studio Express 2013 pour Windows Desktop. Toutefois, il se bloque lorsqu'il est exécuté en mode débogage sous Windows. Cause Une violation d'accès se produit avant que le constructeur termine l'exécution. La sortie de la console est la suivante:
Start...
Ctor
Si l'initialisation du m_validators
est déplacé au constructeur liste alors l'erreur initialiseur disparaît.
Cela peut-il être un bogue de compilateur ou y a-t-il un problème avec la déclaration?
L'ensemble de fonctionnalités et l'implémentation C++ 11 étant incomplètes dans VS2013, il est très probable qu'il s'agisse d'un bogue de compilateur. Essayez de passer à VS2015 (ou pourquoi pas VS2017?) Et voyez-vous que cela fonctionne mieux. –