gpt4 book ai didi

c++ - std::ostringstream 打印 c 字符串的地址而不是其内容

转载 作者:IT老高 更新时间:2023-10-28 21:55:45 29 4
gpt4 key购买 nike

我偶然发现了一个我一开始无法解释的奇怪行为(参见 ideone):

#include <iostream>
#include <sstream>
#include <string>

int main() {
std::cout << "Reference : "
<< (void const*)"some data"
<< "\n";

std::ostringstream s;
s << "some data";
std::cout << "Regular Syntax: " << s.str() << "\n";

std::ostringstream s2;
std::cout << "Semi inline : "
<< static_cast<std::ostringstream&>(s2 << "some data").str()
<< "\n";

std::cout << "Inline : "
<< dynamic_cast<std::ostringstream&>(
std::ostringstream() << "some data"
).str()
<< "\n";
}

给出输出:

Reference     : 0x804a03d
Regular Syntax: some data
Semi inline : some data
Inline : 0x804a03d

令人惊讶的是,在最后一个类型转换中,我们有地址,而不是内容!

为什么会这样?

最佳答案

表达式 std::ostringstream()创建一个临时的,operator<<需要const char* as 参数是一个自由函数,但是这个自由函数不能被临时调用,因为函数的第一个参数的类型是 std::ostream&不能绑定(bind)到临时对象。

话虽如此,<<std::ostringstream() << "some data"解析为对 void* 重载的成员函数的调用打印地址。请注意,可以在临时对象上调用成员函数。

为了调用自由函数,您需要将临时(即右值)转换为左值,这是您可以做的一个技巧:

 std::cout << "Inline        : "
<< dynamic_cast<std::ostringstream&>(
std::ostringstream().flush() << "some data"
).str()
<< "\n";

也就是说,std::ostringstream().flush()返回 std::ostream&这意味着,现在可以调用自由函数,将返回的引用作为第一个参数传递。

另外,您不需要使用 dynamic_cast这里(这很慢,因为它是在运行时完成的),因为对象的类型几乎是已知的,所以你可以使用 static_cast (这在编译时完成的速度很快):

 std::cout << "Inline        : "
<< static_cast<std::ostringstream&>(
std::ostringstream().flush() << "some data"
).str()
<< "\n";

应该可以正常工作。

关于c++ - std::ostringstream 打印 c 字符串的地址而不是其内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8287188/

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