【问题标题】:What happens if you return a non-static local when the return type is static const如果在返回类型为静态 const 时返回非静态本地会发生什么
【发布时间】:2011-09-15 15:54:02
【问题描述】:

如果你有以下功能:

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 返回的地址,还是会实际制作地图的副本?另外,这样做是否安全?

感谢您的反馈!

【问题讨论】:

  • 返回类型不是“静态常量”,它是一个返回常量的静态函数。

标签: c++ static constants


【解决方案1】:

返回类型不是static const map&lt;ushort, ulong&gt;。只有const map&lt;ushort, ulong&gt;。关键字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();

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-03-27
        • 1970-01-01
        • 1970-01-01
        • 2012-09-14
        相关资源
        最近更新 更多