gpt4 book ai didi

c++ - 为什么我不能在构建 ifstream 时传递它?

转载 作者:太空狗 更新时间:2023-10-29 19:58:55 27 4
gpt4 key购买 nike

编译器不喜欢下面的主程序

int get1(ifstream &f){
int count;
f >> count;
return count;
}

int main(int argc, char** argv){
cout << get1(ifstream(argv[1])) << endl;
}

错误信息是:

test.cpp: In function 'int main(int, char**)':
test.cpp:11:33: error: invalid initialization of non-const reference of type 's\
td::ifstream& {aka std::basic_ifstream<char>&}' from an rvalue of type 'std::if\
stream {aka std::basic_ifstream<char>}'
test.cpp:4:5: error: in passing argument 1 of 'int get1(std::ifstream&)'

如果主程序写成这样,这确实有效

int main(int argc, char** argv){
ifstream f(argv[1]);
cout << get1(f) << endl;
}

有没有办法让紧凑的第一种形式起作用?

最佳答案

get1(ifstream(argv[1]))

您正在构建一个临时 ifstream目的。临时对象只能绑定(bind)到 const 引用 ( const ifstream& ),不能绑定(bind)到非常量引用 ( ifstream& )。

Is there a way to make the compact first form work?

这取决于您使用的 C++ 版本。

在 C++11 中,您可以更改函数以使用 rvalue 引用而不是 lvalue 引用:int get1(ifstream&& f) .然后它会很乐意接受临时对象。 (@soon 提供的解决方案)

但是请注意,对于此解决方案,如果您想使用不太紧凑的形式 ifstream f(argv[1]); get1(f);编译器不会按原样接受它 ( cannot bind ‘T’ lvalue to ‘T&&’ )。你必须使用 std::move为了将左值转换为右值:get1(std::move(f)); .

另一种方式,它避免了 std::move要求,将是使用具有通用引用的模板函数(模板的rvalue引用的特殊情况,允许rvalue引用衰减到 lvalue 引用):template<Stream> int get1(Stream&& f) (再次感谢@soon)

在 C++03 中 没有标准的方法来做到这一点:因为临时对象只能绑定(bind)到 const 引用,所以您必须将函数更改为 int get1(const ifstream& f)这将呈现您的 ifstream没用(谁会想要一个无法读取的 ifstream 因为它是 const ?)。

关于c++ - 为什么我不能在构建 ifstream 时传递它?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16620584/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com