如果在返回类型为static const时返回非静态local,会发生什么

时间:2011-09-15 15:54:03

标签: c++ static const

如果您有以下功能:

static const map<ushort, ulong> MakeMap()
{
  map<ushort, ulong> mymap;
  for(int i=0; i<myTableSize; i++)
  {
    mymap[myTable[i].x] = myTable[i].y;
  }
  return mymap;
}

在某个地方使用你:

static const map<ushort, ulong> numMap = MakeMap();

编译器实际上会将numMap设置为从MakeMap返回的地址,还是会实际制作地图的副本?另外,这样做是否安全?

感谢您的反馈!

3 个答案:

答案 0 :(得分:4)

返回类型不是static const map<ushort, ulong>。这只是const map<ushort, ulong>。关键字static适用于该功能。也就是说,它是静态的函数,这意味着函数具有internal linkage * ,并且不能从其他translation unit * 调用。

*浏览链接以了解它们。

现在回到你的问题,首先,返回类型中的const没有意义。以下是更好的:

//remove the static also if you don't want it to have internal linkage
static map<ushort, ulong> MakeMap();

然后你仍然可以写:

 const map<ushort, ulong> numMap = MakeMap();

如果您使用的是良好的编译器,那么很可能它会优化返回值。阅读:

答案 1 :(得分:0)

是的,这样做是安全的。出于大多数实际目的,代码的行为就像复制一样(优秀的编译器may eliminate the need for an actual copy)。

另外,正如其他人所指出的,static不是返回类型的一部分。代码中static的两种用法具有不同的含义。

答案 2 :(得分:0)

您的函数不会返回一个地址,而是返回将被复制的对象,这样做是安全的。如果修改代码使MakeMap返回一个地址,那么mymapy将在某些时候被销毁(取决于编译选项和编译器),因此会崩溃。你必须在堆上分配mymap(使用new),然后销毁它等等....