是否有原因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
的問題是,從之前'{ 「F3」,2" }省略''FileInfo' –
類型Modifications'的'是無關緊要的,'make_tuple(BLA,BLA,BLA)'是一個獨立於你隨後對錶達式結果進行評估的表達式(與C++中的所有表達式相同) –
實際上,我給出了前兩個作爲例子的條目,我故意忽略第三個條目。關鍵是,我預計它可以同時使用'{}'和'FileInfo {}' –