gpt4 book ai didi

c++ - 将 c 字符串发送到非左值 std::ostringstream 奇怪的行为

转载 作者:行者123 更新时间:2023-11-30 03:16:35 26 4
gpt4 key购买 nike

测试代码:

#include <iostream>
#include <sstream>

int main() {
std::ostringstream q;

std::cout << (dynamic_cast<std::ostringstream&>(q<<"hello"<<101).str()) << "\n";
std::cout << (dynamic_cast<std::ostringstream&>(std::ostringstream()<<"hello"<<101).str()) << "\n";
return 0;
}

编译:g++ test.cpp输出:

hello101
hello101

编译:g++ -std=c++98 test.cpp输出:

hello101
0x4b2ec0101

看起来第二个字符串包含指向“hello”字符串而不是字符串本身的指针。为什么?它是 c++98 标准的某些“特性”还是 gcc 中的错误?

最佳答案

在 C++03 中,非成员 operator<< ( source ) 负责打印出 C 字符串,即

template< class Traits >
basic_ostream<char,Traits>& operator<<( basic_ostream<char,Traits>& os,
const char* s );

无法接受右值流,因此选择成员重载(继承自 std::ostream 基类)( source ):

basic_ostream& operator<<( const void* value );

这会打印出地址。

在C++11中,有一个右值流插入运算符,

template< class CharT, class Traits, class T >
basic_ostream< CharT, Traits >& operator<<( basic_ostream<CharT,Traits>&& os,
const T& value );

这确保左值流和右值流的行为相同。请注意,此重载不可能用 C++03 编写,因为绑定(bind)到右值的唯一方法是通过 const 左值引用。

关于c++ - 将 c 字符串发送到非左值 std::ostringstream 奇怪的行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56225617/

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