2017-08-29 5 views
4
#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?

+3

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

Répondre

1

J'ai essayé de construire votre code avec VS2015, et il fonctionne bien dans la version de débogage. J'ai cette sortie:

Start... 
Ctor 
Complete... 

sans aucun "accident".

Il peut s'agir d'un bogue de compilateur avec VS2013. Vous souhaiterez peut-être effectuer une mise à niveau vers un nouveau compilateur C++.