gpt4 book ai didi

c++ - 为什么 `operator<<` 的 `basic_ostream` 的右值重载会返回左值引用?

转载 作者:IT老高 更新时间:2023-10-28 13:01:28 24 4
gpt4 key购买 nike

§27.7.3.9operator<< 定义以下重载:

template <class charT, class traits, class T>
basic_ostream<charT, traits>&
operator<<(basic_ostream<charT, traits>&& os, const T& x);

Effects: os << x
Returns: os

( §27.7.2.6 定义了 operator>> 的右值重载。)
基本上,它只是转发到左值重载。我认为这种重载非常危险(实际上,istreamostream 还要危险),请考虑以下几点:

#include <sstream>
#include <iostream>

int main(){
auto& s = (std::stringstream() << "hi there!\n");
std::cout << s.rdbuf(); // oops
}

Live example on Ideone (未定义行为的完美示例。在 MSVC10 上不为我打印任何内容)。

上面的例子可能看起来很做作,但在泛型代码中或在传递 (std::stringstream() << "text") 时进入这种情况应该不会太难。到提供左值和右值重载并存储 std::ostream 的函数或 std::istream根据过载的不同方式。

现在,反对返回 basic_ostream<charT, traits>&& 的论点是什么?并指定以下内容?

Returns: move(os)

(对于 basic_istream 也是如此。)

有什么我忽略的吗?在目前的状态下,在我看来,它只是看起来很危险,就像一个缺陷。我浏览了LWG issue list并找到 this proposal (嗨@HowardHinnant!)。它确实返回了一个右值,但只是为了能够链接这个特殊运算符的额外好处,而不是专门解决我上面描述的安全问题(尽管它确实确实解决了它)。此外,它被标记为已关闭并为下一个标准重新考虑。因此,我想我会在这里问:

上面提到的重载返回左值引用有什么好的理由吗?

最佳答案

这是一个缺陷,是我的错,对不起。 LWG 1203 (感谢您为我找到它!:-))是我目前对“rvalue-stream-inserter”的正确修复的看法。请注意,您仍然可以捕获它并遇到麻烦:

auto&& s = (std::stringstream() << "hi there!\n");
std::cout << s.rdbuf(); // oops

尽管至少在上面的代码中更明显(因为 &&)你正在做一些你不应该做的事情。

关于c++ - 为什么 `operator<<` 的 `basic_ostream` 的右值重载会返回左值引用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8828973/

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