C ++, как вызвать библиотеку только для заголовков - PullRequest
0 голосов
/ 14 апреля 2020

Я изучил C ++ 17 способ работы с библиотекой только для заголовков, добавив ключевое слово inline:

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

struct C {
    static const inline string N {"abc"};
};

int main() {
    cout << C::N << endl;
    return 0;
}

Запуск над фрагментом кода возвращает abc, как и ожидалось.

Однако, если я попытался использовать стиль до C ++ 17, как показано ниже:

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

struct C {
    static std::string& N() {
        static std::string s {"abc"};
        return s;
    }
};

int main() {
    cout << C::N << endl;
    return 0;
}

Я получил результат 1, а не ожидаемый abc. Мне интересно, почему и как это исправить?

Ответы [ 2 ]

1 голос
/ 14 апреля 2020

Проблема здесь в разнице между вашими двумя «N» декларациями. В первом случае static const inline string N {"abc"}; является строковой переменной. Во втором случае static std::string& N() является функцией. Вот почему, когда вы используете C::N в первый раз, это работает так же, как "abc" вместо него, потому что это просто строковая переменная. По этой же причине во втором случае она работает не так, как ожидалось: C::N - это функция, а не переменная в обычном смысле. Таким образом, чтобы запустить функцию, вы должны вызвать ее с помощью C::N(), которая выводит строку.

Редактировать: см. Комментарий @ 1201ProgramAlarm к вашему вопросу по причине, по которой вы получаете 1 когда функция не вызывается.

0 голосов
/ 14 апреля 2020

Кажется, что это можно легко решить, добавив () после N для 2-го случая:

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

struct C {
    static std::string& N() {
        static std::string s {"abc"};
        return s;
    }
};

int main() {
    cout << C::N() << endl;
    return 0;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...