C++ 传递std::vector<;char>;由IStreamBufu迭代器构造

C++ 传递std::vector<;char>;由IStreamBufu迭代器构造,c++,c++11,gcc,stl,C++,C++11,Gcc,Stl,我有以下代码: std::ifstream ifs(fileName, std::ios_base::in | std::ios_base::binary); std::vector<char> vecdata(std::istreambuf_iterator<char>(ifs), std::istreambuf_iterator<char>()); image->setData(std::move

我有以下代码:

std::ifstream ifs(fileName, std::ios_base::in | std::ios_base::binary);
std::vector<char> vecdata(std::istreambuf_iterator<char>(ifs), 
                          std::istreambuf_iterator<char>());
image->setData(std::move(vecdata));
候选人是:

image.h:12:void image::setData(std::vector&)

我使用的是GCC4.91

符合gcc 5.4的MCVE,相同行为:

这是一个gcc错误吗


谢谢

您得到了最麻烦的解析:使用
{}
而不是
()

std::VectorVecData{std::istreambuf_迭代器(ifs),
std::istreambuf_迭代器()};

您得到了最麻烦的解析:使用
{}
而不是
()

std::VectorVecData{std::istreambuf_迭代器(ifs),
std::istreambuf_迭代器()};

Most Vexing Parse是关键。我是通过搜索Most Vexing Parse得出这个想法的。第二个参数可以解释为指向返回istreambuf_迭代器的函数的未命名指针。但是如何将第一个参数解释为函数声明参数呢?对我来说,这只能是一个右值。最令人烦恼的解析是关键。我是通过搜索最令人烦恼的解析得到这个想法的。第二个参数可以解释为指向返回istreambuf_迭代器的函数的未命名指针。但是如何将第一个参数解释为函数声明参数呢?对我来说,它只能是一个RvalueIs而不是
std::istreambuf_迭代器(ifs)
一个值,即不是一个类型?@PiotrNycz不,在OP的代码中,它是一个名为
ifs
的变量,类型
std::istreambuf_迭代器
@mch不是一个变量;一个参数。
std::istreambuf\u迭代器(ifs)
如何成为参数声明???@galinette:
intmain(int(argc),char**(argv))
是有效的。然而,对于这里不需要额外的父项,它将是类似于
int(*a)[42]
不是
std::istreambuf_迭代器(ifs)
a值,即不是类型?@PiotrNycz否,在OP的代码中,它是一个名为
ifs
的变量,类型
std::istreambuf_迭代器
@mch不是变量;一个参数。
std::istreambuf\u迭代器(ifs)
如何成为参数声明???@galinette:
intmain(int(argc),char**(argv))
是有效的。然而,对于额外的父母来说,这里是不需要的,这将是类似于
int(*a)[42]
void Image::setData(std::vector<char> && data);
image->setData(std::move(vecdata));
                                 ^
std::vector<char> vecdata{std::istreambuf_iterator<char>(ifs), 
                          std::istreambuf_iterator<char>()};