gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 02:40:12 26 4
gpt4 key购买 nike

假设我有以下 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)中强制执行正确的(对我而言)解析?

最佳答案

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

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

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

关于您关于 RVO 的观点,也许我漏掉了什么。当您返回引用时,我不明白为什么要复制您的默认实例。

关于c++ - 声明已初始化的 C++ 静态变量(语法消歧),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29117257/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com