声明已初始化的 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 不支持统一初始化语法。
为确保您完全理解我的意图,我提供了发生错误的行的此行为描述:
如果 T
是对象类型,则调用默认构造函数。
1.1。如果 T
是 class 那么变量应该就地构建,即语句应该支持不可移动的 and/or 不可复制的 classes(不依赖于 RVO ).
如果 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 一个参考。
假设我有以下 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 不支持统一初始化语法。
为确保您完全理解我的意图,我提供了发生错误的行的此行为描述:
如果
T
是对象类型,则调用默认构造函数。1.1。如果
T
是 class 那么变量应该就地构建,即语句应该支持不可移动的 and/or 不可复制的 classes(不依赖于 RVO ).如果
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 一个参考。