2016-12-29 73 views
0

是否有原因std::make_tuple不接受列表初始化對象的參數?將列表初始化對象傳遞給std :: make_tuple

#include <string> 
#include <map> 
#include <cstdint> 

class FileInfo 
{ 
public: 
    FileInfo() = default; 
    FileInfo(const std::string &name, uint64_t size) : mName(name), mSize(size) { } 

    bool operator == (const FileInfo& other) const 
    { 
     return mName == other.mName; 
    } 

private: 
    std::string mName; 
    uint64_t mSize = 0; 
}; 

void function(FileInfo fileInfo) { } 

using Modifications = std::map<std::string, std::tuple<std::string, FileInfo, FileInfo>>; 

int main(int argc, char *argv[]) 
{ 
    Modifications modifications{ 
     { "f1", std::make_tuple("changed", FileInfo{ "f1", 1 }, FileInfo{ "f1", 2 }) }, 
     { "f2", std::make_tuple("removed", FileInfo{ "f2", 1 }, FileInfo{}) }, 
     { "f3", std::make_tuple("added", FileInfo{}, { "f3", 2 }) } // Error 
    }; 

    function({ "f3", 2 }); // OK 

    return 0; 
} 

從地圖上第三對提供了以下錯誤:

Error C2660 'std::make_tuple': function does not take 3 arguments

此錯誤是沒有意義的我。爲什麼std::make_tuple在我明確聲明Modifications的類型爲std::map<std::string, std::tuple<std::string, FileInfo, FileInfo>>時接受第三個參數?是否存在編譯器限制或僅從標準中忽略?

注:這個問題是不相關的,從支撐列表構建元組:initialize-an-stdarray-of-tuples-with-curly-braces

+2

的問題是,從之前'{ 「F3」,2" }省略''FileInfo' –

+0

類型Modifications'的'是無關緊要的,'make_tuple(BLA,BLA,BLA)'是一個獨立於你隨後對錶達式結果進行評估的表達式(與C++中的所有表達式相同) –

+0

實際上,我給出了前兩個作爲例子的條目,我故意忽略第三個條目。關鍵是,我預計它可以同時使用'{}'和'FileInfo {}' –

回答

2

正如評論誤差的事實,你是不是構建FileInfo對象的調用make_tuple功能指出,C++編譯器無法知道你想要第三個對象是什麼。如果更改調用像這樣

std::make_tuple<std::string, FileInfo, FileInfo>("added", FileInfo{}, { "f3", 2 }) 

然後也代碼將工作,你需要的make_tuple功能,能夠推斷出類型的東西,在參數列表。

The compiler cannot deduce the type of an initializer list in a template argument