此代码似乎在启用优化的广泛使用的编译器上中断,尽管它在 Visual Studio 中运行良好。
struct foo
{
foo(int a) { s[0] = '0'+a%10;s[1] = '\0'; }
const char * bar() const { return &s[0]; }
char s[4];
};
int main( )
{
const char * s = foo(1234).bar();
printf("%p %s\n", s, s);
}
Run Code Online (Sandbox Code Playgroud)
我希望即使 foo 是一个右值,它也会在堆栈上构造,并且 's' 将指向有效数据。但是,对于 GCC(版本 7.5 和 9),缓冲区永远不会被初始化。
编译失败示例:
g++-9 --std=c++11 -Wall -pedantic -O3 -o example example.cpp
Run Code Online (Sandbox Code Playgroud) c++ ×1