У меня есть простая структура 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;
}
Порядок оценки аргументов может быть не слева направо и, следовательно, результат неожиданный.
Примечание: wut
можно принять параметры const &
, чтобы избежать копирования.
Совет, не имеющий отношения к вашему вопросу. Передавайте строки через константную ссылку, когда это возможно, чтобы избежать копирования строки. например void wut(const std::string& bad, const std::string& good)
Ваше понимание std::queue
правильное, как это указано в документации. Однако имейте в виду, что в C/C++ стандарт не определяет ни порядок передачи аргументов функции (который определен в ABI), ни порядок их оценки. Компилятор, который вы используете, решил вычислить их справа налево, другой мог бы выбрать слева направо.
Что вы ожидаете, когда запустите свою программу?