提问人:sbi 提问时间:7/11/2010 最后编辑:sbi 更新时间:12/25/2022 访问量:594
为什么 std::basic_ios 会重载一元逻辑否定运算符?
Why does std::basic_ios overload the unary logical negation operator?
问:
C++ IO 流的基类定义返回和返回。这让我想知道我们为什么需要它。当然,也可以通过隐式调用和否定其结果来工作。std::basic_ios
operator void*()
!fail()
operator!()
fail()
operator!()
!is
operator void*()
我在这里遗漏了什么,还是纯粹是出于历史原因?std::basic_ios::operator!()
comp.lang.c++.moderated 上的问题也没有带来任何答案。
答:
查看 Codeblocks 附带的 MinGW 的实现,我看到了以下代码:
operator void*() const
{ return this->fail() ? 0 : const_cast<basic_ios*>(this); }
bool
operator!() const
{ return this->fail(); }
在我看来,它的目的是用于更多用途,而不仅仅是用于检查成功。最重要的是,它还可以用作铸造操作员(我们正在返回)。现在我有点挠头,为什么我们可能想投.但剩下的就很清楚了 - 如果你有一个错误的流,你也可以返回 null。operator void*() const
this
this
void*
评论
operator void*()
fail()
!fail()
operator!()
fail()
好的,来到这里,我去问了comp.lang.c++.moderated。
起初,结果和这里一样糟糕,但最终丹尼尔·克鲁格勒(Daniel Krügler)的回答同意了我的怀疑,即没有技术原因:operator!()
有人告诉我,添加这个额外的声明是为了强调“真实”情况和它的否定之间的对称性,只是为了给读者提供指导,仅此而已。公平地说,成语
operator void*
在这个时候是相当新的,鉴于此,这个功能提供的语法支持并不是很明显的。除此之外,没有进一步的技术理由这样做。[...]
评论
:-/
对于旧的(阅读:不久之后)C++ 编译器,编译器不能保证在需要时隐式调用对象上的类型转换运算符。如果没有声明,那么你不能指望在所有情况下都能工作。C++ 89(或任何 C++ 之前的标准)只是将该区域保留为未定义。cfront
iostream
operator !
!cout
这也是为什么被超载了,而不是或.(当时在标准中甚至没有作为自己的类型存在。我记得我的教授告诉我,在引擎盖下,在 C++ 中期望 a,因为相对于那些将传递给语句的表达式结果类型,该类型可以充当“超集”类型,但我没有在任何地方找到这一点。operator void*()
operator int
operator bool
bool
if()
void*
if
这大约是在 gcc 2 的时候,当时大多数人不支持模板或异常,或者即使支持,也不完全支持它们,所以使用模板对 C++ 进行元编程仍然是一个理论练习,你一定要检查它没有返回空指针。operator new
这让我发疯了好几年。
Stroustrup 的 The C++ Programming Language,第 3 版(1997 年),第 276 页的有趣摘录:
istream 和 ostream 类型依赖于转换函数来启用以下语句:
while (cin >> x) cout << x;
输入操作 cin>>x 返回 istream&。该值被隐式转换为指示 cin 状态的值。然后可以通过 while 测试该值。但是,定义从一种类型到另一种类型的隐式转换通常不是一个好主意,这样就会在转换中丢失信息。
C++ 中有很多似乎是可爱或聪明战胜一致性的胜利。如果 C++ 足够聪明来处理上述循环,我不会介意:
while (!(cin >> x).fail()) cout << x;
因为这虽然更冗长,标点符号更多,但对于初学者来说更清楚。
...实际上,仔细想想,我不喜欢这两种结构。拼出来:
for(;;)
{ cin >> x;
if(!cin)
break;
cout << x;
}
为什么我更喜欢这个?因为这个版本使如何扩展代码变得更加清晰,例如,一次处理两个读取而不是一个。例如,“现有代码复制浮点值序列。我们希望你改变它,这样它就可以把浮点值配对,然后写出来,每行两个,因为我们现在使用的是复数。
但我跑题了。
评论
operator!()
good()
bad()
operator!()
printf
std::string std::format(pattern, ...)
评论
basic_ios
ios_base
:)