我刚刚发现这段 C++ 代码在使用 clang++ 和使用 g++ 时并没有给我相同的结果:
#include <iostream>
#include <string>
using namespace std;
const string& createString(char c) {
static string s;
s="";
for(int i=0; i<10; ++i) {
s+=c;
}
return s;
}
int main() {
cout << createString('a') << ' ' << createString('z') << endl;
return 0;
}
使用 clang++ 它写道:
aaaaaaaaaa zzzzzzzzzz
就像我想要的那样,但是使用 g++ 它写道:
aaaaaaaaaa aaaaaaaaaa
为什么会这样?是否符合 g++ 实现标准? 如果我想让一个函数像这里一样通过引用返回一个临时的“大”类型以避免无用的复制,我该怎么办?
最佳答案
是的,这两种实现都是合规的。 The order of evaluation of function arguments is not specified.
因此,createString('a')
和 createString('z')
可以按任意顺序计算。此外,createString('z')
可以在 createString('a')
的结果写出之前或之后计算。
由于函数是有状态的,并通过引用返回状态,所以两个输出都是允许的,zzzzzzzzzz zzzzzzzzzz
也是如此。
最后,值得注意的是,在多线程环境中,拥有 static
状态将是一个令人头疼的问题。
关于静态变量的 C++ 引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15436166/