考虑以下函数:
void f(const char* str);
假设我想使用 stringstream 生成一个字符串并将其传递给这个函数。如果我想在一个声明中做到这一点,我可以尝试:
f((std::ostringstream() << "Value: " << 5).str().c_str()); // error
这给出了一个错误:“str()”不是“basic_ostream”的成员。好的,所以 operator<< 正在返回 ostream 而不是 ostringstream - 将其转换回 ostringstream 怎么样?
1)这个演员表安全吗?
f(static_cast<std::ostringstream&>(std::ostringstream() << "Value: " << 5).str().c_str()); // incorrect output
现在有了这个,对于 operator<<("Value: ") 调用,它实际上是在调用 ostream 的 operator<<(void*) 并打印一个十六进制地址。这是错误的,我想要文本。
2) 为什么临时 std::ostringstream() 上的 operator<< 调用 ostream 运算符?当然临时有一种'ostringstream'而不是'ostream'?
我也可以强制执行正确的操作员呼叫!
f(static_cast<std::ostringstream&>(static_cast<std::ostringstream&>(std::ostringstream()) << "Value: " << 5).str().c_str());
这似乎有效并将“值:5”传递给 f()。
3)我现在依赖未定义的行为吗?演员阵容看起来很不寻常。
我知道最好的选择是这样的:
std::ostringstream ss;
ss << "Value: " << 5;
f(ss.str().c_str());
...但我对在一行中执行此操作的行为感兴趣。假设有人想做一个(可疑的)宏:
#define make_temporary_cstr(x) (static_cast<std::ostringstream&>(static_cast<std::ostringstream&>(std::ostringstream()) << x).str().c_str())
// ...
f(make_temporary_cstr("Value: " << 5));
这个功能会如预期的那样吗?