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

Declaring initialized C++ static variable (syntax disambiguation)

假设我有以下 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 是 class 那么变量应该就地构建,即语句应该支持不可移动的 and/or 不可复制的 classes(不依赖于 RVO ).

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

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

static const T oDefaultInstance();

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

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

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

静态本机变量被零初始化,否则调用默认构造函数。

关于你关于 RVO 的观点,也许我漏掉了什么。我不明白为什么你的默认实例应该被复制,因为你 return 一个参考。