Почему errno неожиданно равен 0 при неудаче?

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

0

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector