t*i 发帖数: 72 | 1 为啥第二个是invalid的
valid define:
const std::string hello = "Hello";
const std::string message = hello + ", world" + "!";
invalid define:
const std::string exclam = "!";
const std::string message = "Hello" + ", world" + exclam; |
r****r 发帖数: 115 | 2 "Hello" + ", world"
没法加吧
【在 t*i 的大作中提到】 : 为啥第二个是invalid的 : valid define: : const std::string hello = "Hello"; : const std::string message = hello + ", world" + "!"; : invalid define: : const std::string exclam = "!"; : const std::string message = "Hello" + ", world" + exclam;
|
t*i 发帖数: 72 | 3 谢谢
【在 r****r 的大作中提到】 : "Hello" + ", world" : 没法加吧
|
f*******y 发帖数: 988 | 4 string literal比较tricky的地方就是他们的真正类型其实是const char []
这个通过了,因为你的编译器是先算 operator + (std::string, std::string),
const char [8] 被cast成std::string 了
这个不行是因为 operator + (const char [6], const char [8]) 不存在
你搞个const std::string message = hello + (", world" + "!");就不行
【在 t*i 的大作中提到】 : 为啥第二个是invalid的 : valid define: : const std::string hello = "Hello"; : const std::string message = hello + ", world" + "!"; : invalid define: : const std::string exclam = "!"; : const std::string message = "Hello" + ", world" + exclam;
|
t*i 发帖数: 72 | 5 看书的时候随便扫过这些概念,但是印象不够深刻,还是做点练习题目才能有更多的感
性认识。
【在 f*******y 的大作中提到】 : string literal比较tricky的地方就是他们的真正类型其实是const char [] : : 这个通过了,因为你的编译器是先算 operator + (std::string, std::string), : const char [8] 被cast成std::string 了 : 这个不行是因为 operator + (const char [6], const char [8]) 不存在 : 你搞个const std::string message = hello + (", world" + "!");就不行
|
t****u 发帖数: 8614 | 6 std::string, doesn't have string(const char *) constructor, so it won't
allow implicit conversion. it has operator+(const char *) though, so the
first is working, the second doesn't work.
【在 t*i 的大作中提到】 : 为啥第二个是invalid的 : valid define: : const std::string hello = "Hello"; : const std::string message = hello + ", world" + "!"; : invalid define: : const std::string exclam = "!"; : const std::string message = "Hello" + ", world" + exclam;
|
t****t 发帖数: 6806 | 7 怎么可能没有,用脚趾头想也知道肯定有啊。
【在 t****u 的大作中提到】 : std::string, doesn't have string(const char *) constructor, so it won't : allow implicit conversion. it has operator+(const char *) though, so the : first is working, the second doesn't work.
|
f*******y 发帖数: 988 | 8 恩,正确的说法是有一个explicit的ctor,所以就不能implicit的转换了
【在 t****t 的大作中提到】 : 怎么可能没有,用脚趾头想也知道肯定有啊。
|
t****t 发帖数: 6806 | 9 怎么你们发言之前不想想的吗,basic_string的explicit ctor只有一个,是以
Allocator为参数的。从const char*过去,怎么可能需要explicit??
【在 f*******y 的大作中提到】 : 恩,正确的说法是有一个explicit的ctor,所以就不能implicit的转换了
|
c********x 发帖数: 84 | 10
because the operator + has no +( char*, char*), solution is
cast the string "Hello" to string object.
const std::string message = (string)"hello" + ", world" + "!"; // this
should work.
【在 t*i 的大作中提到】 : 为啥第二个是invalid的 : valid define: : const std::string hello = "Hello"; : const std::string message = hello + ", world" + "!"; : invalid define: : const std::string exclam = "!"; : const std::string message = "Hello" + ", world" + exclam;
|
|
|
c****e 发帖数: 1453 | 11 俺觉得是, 在第二种情况下, 编译器不会认为"Hello"后面的 + 重载了, 因为第一个是
const char*, 所以不行. 第一种情况下, 编译器知道 hello这个string后面的+是调用
string::operator +, 加上对于const char*的implicit conversion, 就成了string +
string.
利用这个implicit conversion的时候, 需要第一个是object触发你需要的操作符, 不然编译器会当成普通数据类型处理的. |
c********x 发帖数: 84 | 12
+
不然编译器会当成普通数据类型处理的.
hehe, let me put in this way:
1. string + char[] // + is defined in lib
2. char[] + char[] // no way.
【在 c****e 的大作中提到】 : 俺觉得是, 在第二种情况下, 编译器不会认为"Hello"后面的 + 重载了, 因为第一个是 : const char*, 所以不行. 第一种情况下, 编译器知道 hello这个string后面的+是调用 : string::operator +, 加上对于const char*的implicit conversion, 就成了string + : string. : 利用这个implicit conversion的时候, 需要第一个是object触发你需要的操作符, 不然编译器会当成普通数据类型处理的.
|
c***g 发帖数: 472 | 13 the return type of + of string is a string
and one of the operands of + must be string
【在 t*i 的大作中提到】 : 为啥第二个是invalid的 : valid define: : const std::string hello = "Hello"; : const std::string message = hello + ", world" + "!"; : invalid define: : const std::string exclam = "!"; : const std::string message = "Hello" + ", world" + exclam;
|
P********e 发帖数: 2610 | 14 the key of this problem is to
be aware of the precedence of operations
【在 c***g 的大作中提到】 : the return type of + of string is a string : and one of the operands of + must be string
|
t****t 发帖数: 6806 | 15 huh? not associativity?
【在 P********e 的大作中提到】 : the key of this problem is to : be aware of the precedence of operations
|
P********e 发帖数: 2610 | 16 用这么复杂的词做什么啊
英文不好,我想说,运算顺序,从左,或者从右 makes difference
【在 t****t 的大作中提到】 : huh? not associativity?
|
t****t 发帖数: 6806 | 17 鸡蛋里挑一下骨头,C语言运算符规定的其实是语义,而不是真正的运算顺序。
【在 P********e 的大作中提到】 : 用这么复杂的词做什么啊 : 英文不好,我想说,运算顺序,从左,或者从右 makes difference
|