【问题标题】:Declaring initialized C++ static variable (syntax disambiguation)声明初始化的 C++ 静态变量(语法消歧)
【发布时间】:2015-03-18 08:34:18
【问题描述】:

假设我有以下 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 是标量类型,则在初始化时使用默认值(零)。

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

static const T oDefaultInstance();

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

【问题讨论】:

  • 静态变量已经被零初始化,然后是默认初始化,根本没有任何括号

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


【解决方案1】:

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

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

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

对于您关于 RVO 的观点,也许我错过了一些东西。当您返回引用时,我不明白为什么要复制您的默认实例。

【讨论】:

  • 关于 RVO 的要点是禁止以下内容: static const T oDefaultInstance = T();
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多