Следующий код пытается rename
существующий файл в новом месте.В моей среде переименовать не удается, потому что источник и место назначения находятся в разных точках монтирования.
Если произошел сбой, почему значение errno
отображается как 0
в version2()
?Я не могу представить, чтобы errno
не устанавливался синхронно с rename()
, и я предположил, что операнды на std::ostream::operator<<
были вычислены в порядке слева направо.Если бы это было правдой, разве errno
не получило бы его ненулевое значение из-за сбоя rename
до того, как оно было передано оператору вывода?
Очевидно, что реальность не совпадает с тем, что я себе представлял;Может ли кто-нибудь объяснить порядок оценки или другие соответствующие причины, по которым version2
выводит errno
значение 0
?
Код :
// main.cpp
// Prereq: "./" and "/tmp" are on different mount points.
// Prereq: "./foo.txt" exists.
#include <cstdio>
#include <iostream>
#include <cerrno>
#include <cstring>
void version1()
{
std::cout << __FUNCTION__ << std::endl;
std::cout << rename( "./foo.txt", "/tmp/bar.txt" ) << std::endl;
std::cout << errno << ": " << strerror( errno ) << std::endl;
}
void version2()
{
std::cout << __FUNCTION__ << std::endl;
std::cout << rename( "./foo.txt", "/tmp/bar.txt" ) << ": "
<< errno << ": " << strerror( errno ) << std::endl;
}
int main( int argc, char* argv[] )
{
errno = 0;
version1();
errno = 0;
version2();
return 0;
}
Компиляция и вывод :
> g++ --version && g++ -g main.cpp && ./a.out
g++ (GCC) 4.8.3 20140911 (Red Hat 4.8.3-7)
Copyright (C) 2013 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
version1
-1
18: Invalid cross-device link
version2
-1: 0: Success
(Я искал в SO существующие вопросы, связанные с этим, но ни одного не существует, или мои поисковые фразы не соответствовали ни одному существующему)
Обновление :
Я думаю, что этот вопрос сводится к "каков порядок вычисления операндов для оператора вывода?"в этом случае, согласно Порядку оценки аргументов с использованием std :: cout , ответ "не определен".В духе академического обучения (и генерирования информации, полезной для сообщества) мне любопытно, знает ли кто-нибудь об истории, почему порядок оценки операндов выходного потока не определен: кажется интуитивным, что ониследует оценивать слева направо ...?