The source of your confusion is probably that you are using C++/CLI, so you have access to many different string types. C++/CLI was developed to give you access to both worlds:
- Unmanaged: this is basically native, standard C++ code. While C++/CLI in no way conforms to the C++ standard, it does allow you to mix C++ code in: you can use most C++ libraries (through the "it just works paradigm"). This code is called "unmanaged" because you have to do your own memory management.
- Managed: This is the .NET side of things. Using .net classes, you have access to the useful libraries that microsoft puts out, as well as can work with the garbage collector.
System::String is the managed, .NET string type. This is the type of string that all .NET languages use (C#, VBA, ect). This is a class that will only be able to use with C++/CLI & .NET. Use this type if you are writing pure Windows code, or if want to write a .NET library. In these languages, the "to string" function is actually a member of all classes, and the cast is often implicit. You can use
j = valor1+","+valor2;
If you want to get explicit, look into the Int::ToString function:
System::String^ j= Int32(1).ToString();
std::string is the unmanaged, stl string. This is the standard C++ class, and is available to both C++ and C++/CLI. You will have to marshal this class if you want to use it with other .NET classes. Use this class if you are trying to stay completely in the unmanaged code.
If you are trying to learn C++, I'd suggest turning off C++/CLI for now, and sticking with the standard library string.