Почему errno неожиданно равен 0 при неудаче? - PullRequest
0 голосов
/ 09 октября 2018

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...