g ++ против intel / clang порядок передачи аргументов?

Рассмотрим следующий код (LWS):

#include <iostream>
#include <chrono>

inline void test(
const std::chrono::high_resolution_clock::time_point& first,
const std::chrono::high_resolution_clock::time_point& second)
{
std::cout << first.time_since_epoch().count() << std::endl;
std::cout << second.time_since_epoch().count() << std::endl;
}

int main(int argc, char* argv[])
{
test(std::chrono::high_resolution_clock::now(),
std::chrono::high_resolution_clock::now());
return 0;
}

Вы должны запустить его несколько раз, потому что иногда нет видимой разницы. Но когда есть видимая разница между временем оценки first а также secondрезультат g ++ следующий:

1363376239363175
1363376239363174

и следующее под intel и clang:

1363376267971435
1363376267971436

Это означает, что под g ++ second аргумент оценивается в первую очередь, а под Intel и лязг first аргумент оценивается первым.

Какой из них соответствует стандарту C ++ 11?

7

Решение

Какой из них соответствует стандарту C ++ 11?

Оба допустимы. Чтобы процитировать стандарт (§8.3.6):

Порядок вычисления аргументов функции не определен.

14

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

У меня есть немного более простой пример, чтобы проиллюстрировать ту же проблему.

bash$ cat test.cpp
#include <iostream>
using namespace std;
int x = 0;
int foo()
{
cout << "foo" << endl;
return x++;
}
int bar()
{
cout << "bar" << endl;
return x++;
}
void test_it(int a, int b)
{
cout << "a = " << a << endl
<< "b = " << b << endl;

}
int main(int argc, const char *argv[])
{
test_it(foo(),bar());
return 0;
}

bash$ clang++ test.cpp && ./a.out
foo
bar
a = 0
b = 1
bash$ g++ test.cpp && ./a.out
bar
foo
a = 1
b = 0
0

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