假设我有以下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
是一个类,那么该变量应该就地构造,即该语句应该支持不可移动和/或不可复制的类(不依赖于RVO)。
如果T
是标量类型,则在初始化时使用默认值(零)。
如果我强制编译器将其解释为具有初始化的变量定义,则可以使用下一行存档此类行为:
static const T oDefaultInstance();
我的问题是:如何在C ++ 2003中(或至少在MSVC 2012中)编写上面的行强制正确(对我来说)解析?
答案 0 :(得分:3)
看来,这个简单的解决方案是你想要的:
template<typename T>
const T& GetValueOrDefault(T* pPtr) const
{
static T oDefaultInstance;
return pPtr ? *pPtr : oDefaultInstance;
}
静态原生变量是零初始化的,否则,将调用默认构造函数。
对于你的观点,也许我错过了一些东西。我不明白为什么应该复制你的默认实例,因为你返回一个引用。