gpt4 book ai didi

c++ - 为什么写入临时流失败?

转载 作者:可可西里 更新时间:2023-11-01 18:34:50 24 4
gpt4 key购买 nike

考虑以下代码:

#include <sstream>
#include <iostream>

class Foo : public std::stringstream {
public:
~Foo() { std::cout << str(); }
};

int main()
{
Foo foo;
foo << "Test1" << std::endl;

Foo() << "Test2" << std::endl;

return 0;
}

当我执行它时,它会给我:

004177FC
Test1

我不明白为什么第二个例子给我乱码。临时对象应该一直存在到整个表达式被求值为止,那么为什么它的行为与第一个示例不同?

最佳答案

我测试过。

我可以猜到 operator<<不能将临时对象绑定(bind)到非常量引用,因此任何外部定义的 operator<< 函数都不能在 Foo 临时对象上工作,但是任何类成员函数都可以,如果 ostreamostringstream有任何内部 operator<<他们将工作的成员。

因此可能是对指针的重载是一个成员函数,而 const char * 的特殊成员函数是在外部声明的。

非临时变量可以绑定(bind)到非常量引用以实现更专业的重载。

如果你真的需要这个,你可以使用包装器来解决

class Foo :
{
mutable std::ostringstream oss;
public:
~Foo()
{
std::cout << oss.str();
}

template<typename T>
std::ostream&
operator<<( const T& t ) const
{
return oss << t;
}
};

测试和工作。第一个运算符<< 将返回底层流。

我也试过这个但是它核心转储了:

class Foo : std::ostringstream
{
Foo & nonconstref;
public:
Foo() : nonconstref( *this ) {}
~Foo()
{
std::cout << str();
}

template<typename T>
std::ostream&
operator<<( const T& t ) const
{
return nonconstref << t;
}
};

这也有效:

class Foo : public std::ostringstream
{
public:
Foo() {}
~Foo()
{
std::cout << str();
}

Foo& ncref()
{
return *this;
}
};

int main()
{
Foo foo;
foo << "Test1" << std::endl;

Foo().ncref() << "Test2" << std::endl;

}

关于c++ - 为什么写入临时流失败?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5179522/

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