2014-07-09 4 views
3

Как именно operator+= определен для std::string, но operator+ не определен? См. Мой MWE ниже (http://ideone.com/OWQsJk).C++: Почему «operator + =» определен, но не «operator +» для строк?

#include <iostream> 
#include <string> 
using namespace std; 

int main() { 
    string first; 
    first = "Day"; 
    first += "number"; 
    cout << "\nfirst = " << first << endl; 

    string second; 
    //second = "abc" + "def";  // This won't compile 
    cout << "\nsecond = " << second << endl; 
    return 0; 
} 
+0

Вы ожидаете: ' "ABC" -> оператор + ("DEF") 'работать? – crashmstr

+1

@crashmstr Ну, я понимаю, почему. Это было бы во многих других языках (то есть, строковые литералы - это тип класса). –

ответ

8

Вы должны преобразовать один из необработанных строковых литералов в std::string явно. Вы можете сделать это, как и другие уже упоминалось:

second = std::string("abc") + "def"; 

или C++ 14, вы будете иметь возможность использовать

using namespace std::literals; 
second = "abc"s + "def"; 
// note  ^
6

Те не std::string s, они const char *. Попробуйте это:

second = std::string("abc") + "def"; 
+2

Технически они не 'const char *', они 'const char [4]'. –

+0

@MooingDuck И не технически тоже :-) – juanchopanza

+1

@MooingDuck Технически технически они 'const char (&) [4]'. – 0x499602D2

4

C++: Почему 'оператор + =' определено, но не 'оператор +' для строк?

Это. Это требует, по крайней мере один из операндов быть std::string:

int main() 
{ 
    std::string foo("foo"); 
    std::string bar("bar"); 
    std::string foobar = foo + bar; 
    std::cout << foobar << std::endl; 
} 

Проблема в вашем случае является то, что вы пытаетесь добавить строковые литералы "abc" и "def". Они имеют тип const char[4]. Для этих типов нет operator+.

0

+ будет работать, чтобы объединить две строки только тогда, когда хотя бы один операнд имеет тип std::string.

В "abc" + "def", ни один из операндов не имеет типа std::string.