错误:
error: invalid initialization of non-const reference of type ‘std::istream& {aka std::basic_istream<char>&}’ from an rvalue of type ‘std::ifstream {aka std::basic_ifstream<char>}’
编码:
class MyClass {
private:
// why does this need to be a const reference?
std::istream &fin;
};
MyClass::MyClass(std::string &filename,const char quote, const char sep)
: fin(std::ifstream(filename)), owns_stream(true), sep(sep), quote(quote)
{
}
如果我使私有(private)fin成员为const,则此方法有效。有人可以解释为什么吗?
最佳答案
因为您正在初始化临时引用。只有const
引用可以做到这一点……虽然实际上不起作用,因为您有一个悬挂的引用。引用绑定(bind)的这种特殊用法不会延长临时文件的寿命。
常规方法是首先将流接受到构造函数中:
MyClass(std::istream& strm, const char quote, const char sep)
: fin(strm), owns_stream(true), sep(sep), quote(quote)
{}
然后:
std::ifstream ifs("/tmp/something");
MyClass obj(ifs);
这对于您的用户而言更加灵活。
否则,如果您希望强制使用
std::ifstream
,只需存储实际的std::ifstream
并删除整个临时/引用业务:class MyClass {
public:
MyClass(const std::string& filename)
: fin(filename)
{}
private:
std::ifstream fin;
};
关于c++ - 在构造函数初始化程序中初始化非常量类型时出错?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/32223429/