2016-12-29 42 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