[n00b] Order of strings generates error

C

Charles

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.
 
R

red floyd

Charles said:
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 *).
 
C

Charles

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!
 
R

Ron House

Charles said:
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);
 
J

Jim Langston

Ron House said:
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.


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).
 
I

Ivan Novick

Jim said:
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;
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Similar Threads


Members online

No members online now.

Forum statistics

Threads
473,995
Messages
2,570,230
Members
46,819
Latest member
masterdaster

Latest Threads

Top