Следующий код пытается 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 ответ «не определен». В духе академического обучения (и получения информации, полезной для сообщества) мне любопытно, знает ли кто-нибудь об истории, почему порядок оценки операндов выходного потока не определен: кажется интуитивно понятно, что они должны оцениваться слева направо …?
Задача ещё не решена.
Других решений пока нет …