簡體   English   中英

為什么 MVS 編譯器可以將參數“myStruct”轉換為“myStruct &”。 並且沒有提交錯誤 C2664:無法將“myStruct”轉換為“myStruct &”

[英]Why the MVS compiler can convert argument 'myStruct' to 'myStruct &'. And did not file error C2664: cannot convert 'myStruct' to 'myStruct &'

我有一個類,我使用std::mem_fn在輔助函數之間進行選擇。

  1. 為什么我的代碼被編譯並運行如果我在m_funcContainer deceleration 中丟失& 在代碼&使用已經注釋掉/**/ myStruct/*&*/

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

(但在m_funcContainerInt的情況下,編譯器會引發編譯錯誤)

錯誤 C2664:“void (int &) const”:無法將參數 1 從“int”轉換為“int &”

  1. 我覺得我沒有以最好的方式制定我的問題的標題,你能幫我制定技術上更正確的標題嗎?

為什么編譯器可以在 std::function 中將參數 'myStruct' 轉換為 'myStruct &'

我的簡化代碼是

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 上編譯

您的問題是 MSVC2013 在其默認設置下不是 C++ 編譯器。 它編譯了一種與 C++ 密切相關的語言,但帶有“擴展”。 你被其中之一咬了。

/Za將關閉(大多數?)語言擴展,我相信包括導致您出現問題的那個。

我聽說過一些隨 MSVC(系統標頭)一起提供的標頭可能會出現問題/Za 而且,這是編譯和測試代碼/Za關閉可能有意想不到的行為變化與/Za打開。 默認情況下,我會將它包含在新文件或項目中,如果您有一個舊項目,請激活它並測試它不會導致問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM