考虑以下代码(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和clang下首先评估first
参数。
根据C ++ 11标准,哪一个是真的?
答案 0 :(得分:14)
根据C ++ 11标准,哪一个是真的?
两者都是允许的。引用标准(§8.3.6):
函数参数的评估顺序是未指定的。
答案 1 :(得分:0)
我有一个稍微简单的例子来说明同样的问题。
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