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

问题描述 投票:19回答:3

我偶然发现了我最初无法解释的怪异行为(请参阅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

令人惊讶的是,在最后一个演员表中,我们有地址,而不是内容!

为什么会这样?

c++ stream
3个回答
19
投票

expression std::ostringstream()创建一个临时函数,并且以operator<<作为参数的const char*是一个自由函数,但是该自由函数不能在一个临时函数上调用,因为该函数的第一个参数的类型为[ C0],无法绑定到临时对象。


9
投票

临时不能绑定到对非const形式参数的引用。


4
投票

首先,最简单的解决方案是获取编译器考虑的可能重载的列表,例如os this:

© www.soinside.com 2019 - 2024. All rights reserved.