【问题标题】:Why the MVS compiler can convert argument 'myStruct' to 'myStruct &'. And did not file error C2664: cannot convert 'myStruct' to 'myStruct &'为什么 MVS 编译器可以将参数“myStruct”转换为“myStruct &”。并且没有提交错误 C2664: cannot convert 'myStruct' to 'myStruct &'
【发布时间】:2015-10-26 12:13:54
【问题描述】:

我有一个类,我使用std::mem_fn 在辅助函数之间进行选择。

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

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

(但在m_funcContainerInt的情况下编译器会出现编译错误)

错误 C2664: 'void (int &) const' : 无法将参数 1 从 'int' 到 'int &'

  1. 我觉得我的问题的标题没有以最佳方式制定,请您帮我制定技术上更正确的标题吗?

为什么编译器可以将参数 'myStruct' 转换为 'myStruct &' in 标准::函数

我的简化代码是

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
{}

已编辑 我正在 Microsoft Visual Studio 2013 上编译

【问题讨论】:

  • 我一直在查看这段代码,如果你在 std::map 声明中删除了引用,那么它不应该编译,但由于函数签名不匹配,这是出于不同的原因。您能否提供一个minimal reproducible example,因为我不确定您是如何得到错误的。
  • 感谢您的回复。我将创建一个简单的例子。
  • 在为MyStructg++ 4.9.3/cygwin 等缺少的类添加一些前向引用后,编译,函数签名采用引用。
  • clang 相同,但如果您删除void myStruct::funcMyStruct(myStruct&amp; arg1) const 中的引用,它也会编译。
  • 抱歉,提供错误示例。所以我编辑了有问题的代码并将我的测试项目中的代码放在那里。

标签: c++ c++11 std


【解决方案1】:

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

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

我听说一些 MSVC 附带的头文件(系统头文件)可能与 /Za 有问题。而且,在关闭/Za 的情况下编译和测试的代码在打开/Za 的情况下可能会发生意外的行为变化。默认情况下,我会将它包含在新文件或项目中,如果您有旧项目,请激活它并测试它不会导致问题。

【讨论】:

  • 所以你建议Disable Language Extensions?默认为No
  • 我已禁用 Disable Language Extensions 将其放入 Yes (/Za) 并得到 error C2664: 'void (myStruct &amp;) const' : cannot convert argument 1 from 'myStruct' to 'myStruct &amp;'
  • @TM 我相信哪个是正确的错误?顺便说一句,std::async 也有类似的问题,但在库本身(/Za 不会修复它),这就是我在上面谨慎的原因。
  • 是的,这是一个错误。我有一个错字,错过了&amp;,并没有出现任何编译错误,我花了几个小时才找到我的错误。
  • 那么你会建议用这个Za, /Ze (Disable Language Extensions)做什么?禁用它正常吗?
猜你喜欢
  • 2017-07-06
  • 1970-01-01
  • 1970-01-01
  • 2011-12-08
  • 2011-08-02
  • 1970-01-01
  • 1970-01-01
  • 2023-01-05
  • 1970-01-01
相关资源
最近更新 更多