By using this site, you agree to our updated Privacy Policy and our Terms of Use. Manage your Cookies Settings.
454,442 Members | 1,437 Online
Bytes IT Community
+ Ask a Question
Need help? Post your question and get tips & solutions from a community of 454,442 IT Pros & Developers. It's quick & easy.

[n00b] Order of strings generates error

P: n/a
I am learning from the Accelerated C++ book. The following example
doesn't work and I don't know why:

#include <iostream>
#include <string>
int main () {
const std::string exclam = "!";
const std::string message = "Hello" + ", world" + exclam;
return 0;
}
But if I invert strings, it works:
#include <iostream>
#include <string>
int main () {
const std::string exclam = "!";
const std::string message = ", world" + exclam + "Hello";
return 0;
}

Unfortunately there's no explanation why. Could you tell me please?
Thanks.

Jan 2 '07 #1
Share this Question
Share on Google+
6 Replies


P: n/a
Charles wrote:
I am learning from the Accelerated C++ book. The following example
doesn't work and I don't know why:

#include <iostream>
#include <string>
int main () {
const std::string exclam = "!";
const std::string message = "Hello" + ", world" + exclam;
return 0;
}
But if I invert strings, it works:
#include <iostream>
#include <string>
int main () {
const std::string exclam = "!";
const std::string message = ", world" + exclam + "Hello";
return 0;
}

Unfortunately there's no explanation why. Could you tell me please?
Thanks.
+ associates left to right. So in your first case, you are trying to
add two string literals (char arrays) together, and then add the
exclamation point. There is no operator+ which takes two const char *'s
as parameters.

In the second case, you are "adding" a string literal to a std::string,
and there is an operator+(const char*, const std::string&) defined,
which returns a std::string, so then you add another string literal to
the returned string, using operator+(const std::string&, const char *).

Jan 2 '07 #2

P: n/a

red floyd escreveu:
+ associates left to right. So in your first case, you are trying to
add two string literals (char arrays) together, and then add the
exclamation point. There is no operator+ which takes two const char *'s
as parameters.

In the second case, you are "adding" a string literal to a std::string,
and there is an operator+(const char*, const std::string&) defined,
which returns a std::string, so then you add another string literal to
the returned string, using operator+(const std::string&, const char *).
Ah ok, thank you!

Jan 2 '07 #3

P: n/a
Charles wrote:
I am learning from the Accelerated C++ book. The following example
doesn't work and I don't know why:
What do you mean "doesn't work"??? Compiler error? What is it? Runtime
error, wrong output, what? If you want help, please write a coherent
account of your problem. Putting "n00b" in the title is not an excuse
for laziness, only for ignorance.
#include <iostream>
#include <string>
int main () {
const std::string exclam = "!";
const std::string message = "Hello" + ", world" + exclam;
return 0;
}
But luckily, the problem is obvious. The + operator is left-associative.
Putting + between two C-style literals is attempting to call the
(nonexistent) operator that adds two char pointers. The above could be
fixed by writing:

"Hello" + (", world" + exclam);

--
Ron House ho***@usq.edu.au
http://www.sci.usq.edu.au/staff/house
Jan 2 '07 #4

P: n/a
"Ron House" <ho***@usq.edu.auwrote in message
news:45************@usq.edu.au...
Charles wrote:
>I am learning from the Accelerated C++ book. The following example
doesn't work and I don't know why:

What do you mean "doesn't work"??? Compiler error? What is it? Runtime
error, wrong output, what? If you want help, please write a coherent
account of your problem. Putting "n00b" in the title is not an excuse for
laziness, only for ignorance.
>#include <iostream>
#include <string>
int main () {
const std::string exclam = "!";
const std::string message = "Hello" + ", world" + exclam;
return 0;
}

But luckily, the problem is obvious. The + operator is left-associative.
Putting + between two C-style literals is attempting to call the
(nonexistent) operator that adds two char pointers. The above could be
fixed by writing:

"Hello" + (", world" + exclam);
You know, this question comes up quite a bit, and it even bit me a few times
til I fugred it out. I believe that in C and C++ adding two pointers is
undefined behavior. You can add an int to a pointer, but not a pointer to a
pointer. So, I've been thinking, would it make sense to make an
operator+(const char*, const char*) that would return a std::string? What
would be the drawbacks to this (other than the possible difficulty of
implementing it).

Jan 2 '07 #5

P: n/a

Jim Langston wrote:
You know, this question comes up quite a bit, and it even bit me a few times
til I fugred it out. I believe that in C and C++ adding two pointers is
undefined behavior. You can add an int to a pointer, but not a pointer to a
pointer. So, I've been thinking, would it make sense to make an
operator+(const char*, const char*) that would return a std::string? What
would be the drawbacks to this (other than the possible difficulty of
implementing it).
Can you give an example where this functionality would be practical to
use? The example given above is not a good use case because you can
just do the following and the string literals will be concatenated
without having to construct an object:

std::string one = "Santa";
std::string two = "Hello World " "from " + one;

----
Ivan
http://www.0x4849.net

Jan 2 '07 #6

P: n/a
On Tue, 02 Jan 2007 13:10:10 +1000, Ron House wrote:
>Charles wrote:
>I am learning from the Accelerated C++ book. The following example
doesn't work and I don't know why:
>#include <iostream>
#include <string>
int main () {
const std::string exclam = "!";
const std::string message = "Hello" + ", world" + exclam;
return 0;
}

But luckily, the problem is obvious.
The problem is obviously not obvious for someone who learns C++ from
"Accelerated C++".
Jan 2 '07 #7

This discussion thread is closed

Replies have been disabled for this discussion.