[英]C++ reference on static variable
我只是发现这个小小的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 ++它写道:
aaaaaaaaa zzzzzzzzzz
就像我想要的那样,但是用g ++写道:
aaaaaaaaa aaaaaaaaa
为什么会这样? g ++实现标准是否合规? 如果我想要一个函数通过像这样的引用返回一个临时的“大”类型,以避免无用的副本,我该怎么办?
是的,两种实现都是兼容的。 未指定函数参数的评估顺序。
因此,可以按任何顺序计算createString('a')
和createString('z')
。 此外,可以在写出createString('a')
的结果之前或之后评估createString('z')
。
由于该函数是有状态的,并且通过引用返回状态,因此两个输出都是允许的, zzzzzzzzzz zzzzzzzzzz
也是zzzzzzzzzz zzzzzzzzzz
。
最后,值得注意的是, static
状态将是多线程环境中的主要问题。
如果我想要一个函数通过像这样的引用返回一个临时的“大”类型,以避免无用的副本,我该怎么办?
它不会。 RVO和NRVO可以轻而易举地解决这个问题。 另外,移动语义。 简而言之,根据值返回std::string
没有任何问题。
如果我想要一个函数通过像这样的引用返回一个临时的“大”类型,以避免无用的副本,我该怎么办?
每个表达只调用一次。 例如,这将正常工作:
std::cout << createString('a') << ' ';
std::cout << createString('z') << std::endl;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.