Я использовал тот же метод для конкатенации строк, но в первом показывается ошибка, а во втором показывается результат - PullRequest
2 голосов
/ 24 марта 2020

Этот код показывает ошибку.

#include <bits/stdc++.h>

using namespace std;

int main() {
    string s;
    s="b"+"k"+"4";
    cout<<s<<endl;
    return 0; 
}

Этот код работает правильно.

#include <bits/stdc++.h>

using namespace std;

int main() {
    string s;
    string s1 = "a";
    s=s1+"b"+"k"+"4";
    cout<<s<<endl;
    return 0; 
}

Я не знаю, почему это происходит, в обоих случаях я использую строки?

Ответы [ 2 ]

3 голосов
/ 24 марта 2020

При

s="b"+"k"+"4";

ваши буквенные строки будут распадаться на указатели, и вы сложите эти указатели вместе и присвойте результат s. Это добавление указателя не имеет смысла, нет перегруженной операторной функции +, которая принимает два const char * аргумента.

Но с

s=s1+"b"+"k"+"4";

вы начинаете с объекта std::string, для которых есть перегруженные + операторные функции, которые возвращают std::string объект. Короче говоря, это что-то похожее на

s=((s1+"b")+"k")+"4";

То есть у вас есть s1 + "b", который возвращает временный std::string, к которому вы затем добавляете "k", который возвращает временный std::string, к которому вы добавьте "4", который возвращает временный std::string, который назначен на s. Или с явно используемыми вызовами временных объектов и функций:

std::string t1 = operator+(s1, "b");
std::string t2 = operator+(t1, "k");
std::string t3 = operator+(t2, "4");
s = t3;
1 голос
/ 24 марта 2020

Принятый ответ совершенно правильный, но я просто подумал, что было бы полезно показать выражение отравления.

Технику часто называют «заражение» или «отравление» выражений. Библиотека выражений, которая широко использует это, boost yap. Идея состоит в том, чтобы «заразить» самое левое выражение с помощью «строгости» (простите за мой французский). Пример

#include <iostream>
#include <string>

int main(int, char**){
    auto s = std::string("a") + "b" + "c";
    std::cout << "s = " << s << '\n';
    return 0;
}

Создание крайнего левого выражения строкой заражает все выражение, заставляя компилятор искать оператор std :: string +, который находит правое выражение char *, которое является именно тем оператором, который нам нужен.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...