静态const引用临时值

时间:2011-01-06 13:41:43

标签: c++

我有一个模板化的类,它依赖于两个模板参数来计算它的值,但只有一个用于构造。我想在其生命周期中减轻对第二个的依赖。我正在考虑通过使用模板化静态函数来计算值,然后创建一个实例。这个类中的所有成员都是const POD类型,并且在应用程序启动时会创建很多这个类。

template < class member >
class FOO {
public:
 FOO() : a(7) {};

 template < class scope >
 static FOO CreateFOO()
 {
  return FOO();
 };

private:
 const int a;
};

template < class member, class scope >
const FOO< member >* function()
{
 static const FOO< member >& temp = FOO< member >::CreateFOO< scope >();

 return &temp;
}

int main() {

 const FOO<int>* b = function< int, int >();

 return 0;
}

我考虑过移动语义,但因为我只是包含const POD类型,所以实际上没有任何交换和移动只是复制和销毁。以上是否合理/有效?我读过的所有内容都表明它没问题!有更好的方法吗?

2 个答案:

答案 0 :(得分:2)

这应该没问题。由于引用temp绑定到临时对象,因此临时对象的生命周期延长到temp的生命周期,该生命周期延伸到main()的末尾。

但我认为没有任何真正的理由在那里使用参考。为什么不呢:

{
    static const FOO<member> foo = FOO<member>::CreateFOO<scope>();
    return &foo;
}

您的编译器可能可以优化复制构造函数。如果没有,你说它是所有POD成员,所以没什么大不了的。

无论哪种方式,您可能会担心static deinitialization order fiasco。或者也许你确定它们永远不会被用于析构函数。

答案 1 :(得分:0)

我知道这是一个人为的例子。仍然没有理由给出static FOO CreateFOO()的存在,在这种情况下除了默认构造对象之外什么也没做。如果您只是创建了一个模板构造函数:

template < class member >
class FOO {
public:
template < class scope > FOO(scope);

然后你会有一个单身人士的标准表格:

template < class member, class scope >
const FOO< member >& function(scope your_scope)
{
 static FOO<member> temp(your_scope);
 return temp;
}