我对在屏幕上打印文字有疑问。我虽然没有有效的“+”运算符来输出流式文本。为什么这个有效:
std::cout << ("print this number " + boost::lexical_cast<std::string>(5) + ". " ) << std::endl;
尽管有这样的complie错误:
std::cout << ("print this number " + "5" + ". " ) << std::endl;
错误:类型'const char [19]'和'const char [2]'到二进制'operator +'的无效操作数
我使用 gcc 4.7.3 和C ++ 03。
答案 0 :(得分:6)
boost::lexical_cast
会返回std::string
,其operator +(const char *, const std::string&)
和operator +(const std::string&, const char *)
已为其定义。所以你的代码相当于:
std::cout << std::string("print this number 5. ") << std::endl;
operator +
没有调用std::ostream
个参数。
在第二行中,您尝试添加字符数组(例如const char [19]
和const char [2]
),这是语言规则的错误。
答案 1 :(得分:3)
这是因为首先评估括号内的表达式。
std::string
的类型是+
。这会导致const char*
std::string
的操作符超载(两边),返回std::string
。
所以括号中表达式的类型是<<
,并且流为它重载"print this number " + "5" + ". "
。
最后+
将无法编译,因为const char[]
对{{1}}参数没有意义,即使它们衰减指针类型。
答案 2 :(得分:0)
显然,<<
在+
之前执行 - 仅通过强制执行括号。 class Person
{
public string Name {get; set;}
public int Amount {get; set;}
}
运算符适用于它周围的字符串,为什么它不起作用?
答案 3 :(得分:0)
这与流媒体没有任何关系。它只是关于"print this number " + boost::lexical_cast<std::string>(5) + ". "
与"print this number " + "5" + ". "
的有效性。
第一部作品的原因是第二部分是std::string
,而不是字符串文字。运算符+用于将std::string
连接在一起或用于串联对象和字符串文字(C风格字符串)的混合,但不适用于纯C风格的字符串,如第二个表达式中那样。