给定这个最小的例子。
#include <iostream>
#include <string>
void print_ptr(const std::string& s)
{
const char* data = s.data();
std::cout << "ptr: " << (void*)data << std::endl;
}
std::string str_return(const char* suffix)
{
std::string s("prefix");
s += " ";
s += suffix;
print_ptr(s);
return s;
}
int main()
{
std::string s = str_return("suffix"), t;
print_ptr(s);
t = str_return("suffix2");
print_ptr(t);
return 0;
}
我是这样编译的:
g++ -std=c++98 -fno-elide-constructors -g -Wall str_return.cpp -o str_return
我的 g++:
gcc version 4.7.1
输出:
ptr: 0x804b04c
ptr: 0x804b04c
ptr: 0x804b07c
ptr: 0x804b07c
为什么指针仍然相等?
- 它不应该是返回值优化——我把它关掉了
- 它不应该是移动构造函数,因为我采用了一个非常古老的 C++ 标准
如何禁用此行为?