声明初始化的C ++静态变量(语法消歧)

时间:2015-03-18 08:34:18

标签: c++ c++11 syntax c++03

假设我有以下C ++ 11代码:

template<typename T>
const T& GetValueOrDefault(T* pPtr) const
{
    static const T oDefaultInstance {};     // MSVC error here.
    return pPtr ? *pPtr : oDefaultInstance;
}

我遇到的问题是它在MSVC 2012中无效:MSVC 2012不支持统一初始化语法。

为了确保您完全理解我的意图,我提供了发生错误的行的此行为描述:

  1. 如果T是对象类型,则调用默认构造函数。

    1.1。如果T是一个类,那么该变量应该就地构造,即该语句应该支持不可移动和/或不可复制的类(不依赖于RVO)。

  2. 如果T是标量类型,则在初始化时使用默认值(零)。

  3. 如果我强制编译器将其解释为具有初始化的变量定义,则可以使用下一行存档此类行为:

    static const T oDefaultInstance();
    

    我的问题是:如何在C ++ 2003中(或至少在MSVC 2012中)编写上面的行强制正确(对我来说)解析?

1 个答案:

答案 0 :(得分:3)

看来,这个简单的解决方案是你想要的:

template<typename T>
const T& GetValueOrDefault(T* pPtr) const
{
    static T oDefaultInstance;
    return pPtr ? *pPtr : oDefaultInstance;
}

静态原生变量是零初始化的,否则,将调用默认构造函数。

对于你的观点,也许我错过了一些东西。我不明白为什么应该复制你的默认实例,因为你返回一个引用。