为什么我不能 return std::getline 的 as-if-boolean 结果?
Why can't I return std::getline's as-if-boolean result?
一个标准的成语是
while(std::getline(ifstream, str))
...
如果可行,为什么我不能说
bool getval(std::string &val)
{
...
std::ifstream infile(filename);
...
return std::getline(infile, val);
}
g++ 表示“cannot convert 'std::basic_istream<char>' to 'bool' in return
”。
bool
值函数中 return
语句的布尔上下文是否与 while()
的布尔上下文有某种不同,使得 std::basic_istream
在一种情况下执行在另一种情况下不起作用?
附录:这里显然存在一些版本和语言标准依赖性。我在 g++ 8.3.0 中遇到了上述错误。但是我没有使用 gcc 4.6.3 或 LLVM (clang) 9.0.0.
std::basic_istream
的 boolean conversion operator 是 explicit
。这意味着该类型的实例不会隐式成为 bool
,但可以显式转换为一个,例如通过键入 bool(infile)
.
条件语句考虑显式布尔转换运算符,即 if
、while
等的表达式部分。有关上下文转换的更多信息 here。
但是,return 语句不会考虑 explicit
转换运算符或构造函数。所以你必须明确地将它转换为 return
.
的布尔值
一个标准的成语是
while(std::getline(ifstream, str))
...
如果可行,为什么我不能说
bool getval(std::string &val)
{
...
std::ifstream infile(filename);
...
return std::getline(infile, val);
}
g++ 表示“cannot convert 'std::basic_istream<char>' to 'bool' in return
”。
bool
值函数中 return
语句的布尔上下文是否与 while()
的布尔上下文有某种不同,使得 std::basic_istream
在一种情况下执行在另一种情况下不起作用?
附录:这里显然存在一些版本和语言标准依赖性。我在 g++ 8.3.0 中遇到了上述错误。但是我没有使用 gcc 4.6.3 或 LLVM (clang) 9.0.0.
std::basic_istream
的 boolean conversion operator 是 explicit
。这意味着该类型的实例不会隐式成为 bool
,但可以显式转换为一个,例如通过键入 bool(infile)
.
条件语句考虑显式布尔转换运算符,即 if
、while
等的表达式部分。有关上下文转换的更多信息 here。
但是,return 语句不会考虑 explicit
转换运算符或构造函数。所以你必须明确地将它转换为 return
.