Стандартное недопонимание очереди

У меня есть простая структура C++, которая создает очередь std::queue с argv из main.

Затем он предоставляет метод ::cunext для возврата текущего значения перед его извлечением из очереди.

Похоже, что если я вызову этот метод в качестве параметров функции, он вернет параметры как:

Вут (cunext(), cunext());

С [1, 2] в качестве записи в основной я получаю следующий результат:

первый параметр — 2
второй параметр равен 1

Это недопонимание std::queue с моей стороны?

Виновный код:

#include <iostream>
#include <queue>

using namespace std;

struct Args
{
    public:
        typedef std::string Arg;

        Args(int argc, char* argv[]);

        Arg current() const;
        Arg cunext();

    private:
        std::queue<std::string> q_args; ///< Queue of arguments as std::string objects.
};

Args::Args(int argc, char* argv[]):
    q_args()
{
    for(int i=1; i<argc; i++)   // build queue for arguments
    {
        q_args.push(*(++argv));   // skip first argument (as for path)
    }
};

inline Args::Arg Args::current() const
{
    return q_args.front();
};

inline Args::Arg Args::cunext()
{
    Arg ret = current();
    q_args.pop();
    return ret;
};

void wut(std::string bad, std::string good)
{
    cout << "first param is " << bad << endl;
    cout << "second param is " << good << endl;
}

int main(int argc, char* argv[])
{
    Args args(argc, argv);
    wut(args.cunext(),args.cunext());
    return 0;
}

Что вы ожидаете, когда запустите свою программу?

Some programmer dude 22.07.2024 09:26

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

kiner_shah 22.07.2024 09:26

Примечание: wut можно принять параметры const &, чтобы избежать копирования.

wohlstad 22.07.2024 09:36

Совет, не имеющий отношения к вашему вопросу. Передавайте строки через константную ссылку, когда это возможно, чтобы избежать копирования строки. например void wut(const std::string& bad, const std::string& good)

selbie 22.07.2024 09:40
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
4
83
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Ваше понимание std::queue правильное, как это указано в документации. Однако имейте в виду, что в C/C++ стандарт не определяет ни порядок передачи аргументов функции (который определен в ABI), ни порядок их оценки. Компилятор, который вы используете, решил вычислить их справа налево, другой мог бы выбрать слева направо.

Другие вопросы по теме