静态变量的 C++ 引用

标签 c++ reference static

我刚刚发现这段 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/

相关文章:

c++ - 在 C++ 中使用没有对象的字符串变量调用静态类结构

c++ - 追加 __FUNCTION__ 宏提供的字符串

c++ - 用于音频输出的简单c++ win控制台程序?

android - 从 QT/C++ 项目访问 Android Calendar Provider

c++ - 使用指针访问 QVector 的元素

c - 结构中的静态变量位于何处?

c++ - 添加要映射的对象的唯一指针

rust - 函数什么时候可以返回引用?

php - 错误消息 “Strict standards: Only variables should be passed by reference”

c++ - 如何优化 curl 库的大小?