avatar
a string define question (c++)# Programming - 葵花宝典
t*i
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;
avatar
r*r
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;

avatar
t*i
3
谢谢

【在 r****r 的大作中提到】
: "Hello" + ", world"
: 没法加吧

avatar
f*y
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;

avatar
t*i
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" + "!");就不行

avatar
t*u
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;

avatar
t*t
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.

avatar
f*y
8
恩,正确的说法是有一个explicit的ctor,所以就不能implicit的转换了

【在 t****t 的大作中提到】
: 怎么可能没有,用脚趾头想也知道肯定有啊。
avatar
t*t
9
怎么你们发言之前不想想的吗,basic_string的explicit ctor只有一个,是以
Allocator为参数的。从const char*过去,怎么可能需要explicit??

【在 f*******y 的大作中提到】
: 恩,正确的说法是有一个explicit的ctor,所以就不能implicit的转换了
avatar
c*x
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;

avatar
c*e
11
俺觉得是, 在第二种情况下, 编译器不会认为"Hello"后面的 + 重载了, 因为第一个是
const char*, 所以不行. 第一种情况下, 编译器知道 hello这个string后面的+是调用
string::operator +, 加上对于const char*的implicit conversion, 就成了string +
string.
利用这个implicit conversion的时候, 需要第一个是object触发你需要的操作符, 不然编译器会当成普通数据类型处理的.
avatar
c*x
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触发你需要的操作符, 不然编译器会当成普通数据类型处理的.

avatar
c*g
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;

avatar
P*e
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

avatar
t*t
15
huh? not associativity?

【在 P********e 的大作中提到】
: the key of this problem is to
: be aware of the precedence of operations

avatar
P*e
16
用这么复杂的词做什么啊
英文不好,我想说,运算顺序,从左,或者从右 makes difference

【在 t****t 的大作中提到】
: huh? not associativity?
avatar
t*t
17
鸡蛋里挑一下骨头,C语言运算符规定的其实是语义,而不是真正的运算顺序。

【在 P********e 的大作中提到】
: 用这么复杂的词做什么啊
: 英文不好,我想说,运算顺序,从左,或者从右 makes difference

相关阅读
logo
联系我们隐私协议©2024 redian.news
Redian新闻
Redian.news刊载任何文章,不代表同意其说法或描述,仅为提供更多信息,也不构成任何建议。文章信息的合法性及真实性由其作者负责,与Redian.news及其运营公司无关。欢迎投稿,如发现稿件侵权,或作者不愿在本网发表文章,请版权拥有者通知本网处理。