为什么MVS编译器可以将参数'myStruct'转换为'myStruct&'。并没有提交错误C2664:无法将'myStruct'转换为'myStruct&'

时间:2015-10-26 12:13:55

标签: c++ c++11 std

我有一个类,我使用std::mem_fn来选择辅助函数。

  1. 为什么我的代码被编译并运行如果我在&减速中缺少m_funcContainer?在使用& /**/
  2. 注释的代码myStruct/*&*/

    std::map < std::string, std::function<void(const myClass*, myStruct/*&*/) >> m_funcContainer

    (但是m_funcContainerInt编译器出现编译错误)

      

    错误C2664:'void(int&amp;)const':无法转换参数1   'int'到'int&amp;'

    1. 我觉得我没有以最好的方式提出问题的标题,请你帮我制定技术上更正确的标题?
    2.   

      为什么编译器可以将参数'myStruct'转换为'myStruct&amp;'在   的std ::功能

      我的简化代码是

      myClass.h

      #include <memory>
      #include <map>
      #include <functional>
      
      struct ExtraFlag
      {
      };
      
      struct Flag
      {
      };
      
      struct myStruct
      {
          std::shared_ptr<ExtraFlag>         extraFlag;
          std::shared_ptr<Flag>              flag;
      
          explicit myStruct()
          {
          }
      };
      
      class myClass
      {
      private:
          std::map < std::string, std::function<void(const myClass*, myStruct/*&*/) >> m_funcContainer;
          std::map < std::string, std::function<void(const myClass*, int/*&*/) >> m_funcContainerInt;
      
      private:
          void funcMyStruct(myStruct& arg1) const;
          void funcInt(int& arg1) const;
      public:
          myClass();
      };
      

      myClass.cpp

      #include "myClass.h"
      myClass::myClass()
      {
          m_funcContainer["func"] = std::mem_fn(&myClass::funcMyStruct);
          myStruct myStructInstance;
          m_funcContainer.at("func")(this, myStructInstance);
      
          int a;
          m_funcContainerInt["func"] = std::mem_fn(&myClass::funcInt);
          m_funcContainerInt.at("func")(this, a);
      }
      void myClass::funcMyStruct(myStruct& arg1) const
      {}
      
      void myClass::funcInt(int& arg1) const
      {}
      

      EDITED 我正在编辑Microsoft visual studio 2013

1 个答案:

答案 0 :(得分:2)

您的问题是MSVC2013在其默认设置下不是C ++编译器。它编译了一种与C ++密切相关的语言,但带有“扩展”。你被其中一个人咬了。

/Za会关闭(大多数?)语言扩展程序,我相信包括导致您出现问题的语言扩展程序。

我听说有报告称MSVC附带的某些标头(系统标头)可能会遇到/Za的问题。并且,在/Za关闭的情况下编译和测试的代码可能会在/Za打开时出现意外的行为更改。我会默认将它包含在新文件或项目中,如果你有一个旧项目激活它,测试它不会导致问题。