C++ static constexpr 成员在类外重新声明

2024-05-01

对于以下代码,为什么 main 中的第一个案例无需重新声明 Foo::bar 就可以正常工作,而带有该函数的第二个案例则需要它?

struct Foo{
static constexpr int bar = 30;
};
//Declaration of Foo::bar outside of struct
constexpr int Foo::bar;
int returnconstexpr(const int& x) { return x; }

int main()
{
    //Ok without declaration outside of struct
    std::cout << Foo::bar << std::endl;

    //Requires declaration outside of struct
    std::cout << returnconstexpr(Foo::bar) << std::endl;

    //Here static constexpr works as a definition
    static constexpr int x = 2;
    std::cout << returnconstexpr(x) << std::endl;

    return 0;
}

我假设这是因为在第一种情况下,编译器实际上只是保留该值,而在第二种情况下,该函数需要一个在没有重新声明的情况下尚不存在的地址。如果是这样,那么我所说的声明实际上是定义吗?我对此感到困惑,因为类中提供了初始化程序,但它并没有使其成为定义。例如,第三种情况就可以正常工作。


我假设这是因为在第一种情况下,编译器 从字面上看,只是保留该值,而在第二种情况下 函数需要一个不存在的地址 重新声明。如果是这样的话,那么我要说的就是 声明实际上是一个定义?

你已经回答了问题。静态成员是defined在课堂之外,所以你所拥有的只是一个定义。当您将其传递给函数时,地址是必需的,因此您需要定义静态成员。在第一种情况下,编译器只是替换Foo::bar与价值。

现在将函数签名更改为以下内容:

int returnconstexpr(int x) { return x; }

在上述情况下,您将不再需要该定义。

C++ 标准 3.2 中的规则如下:

名称显示为潜在计算表达式的变量 x ex 是 odr-used 除非 x 是满足要求的对象 出现在常量表达式 (5.19) 中,并且 ex 是以下元素 表达式 e 的潜在结果集,其中 左值到右值转换 (4.1) 应用于 e,或者 e 是 丢弃值表达式(第 5 条)。

在上述情况下,立即应用左值到右值的转换,因此不使用 odr(如标准所述)并且不需要定义。简单来说,这意味着它可以只使用值而不需要知道地址,但是当您使用引用类型(const int&)时,这需要编译器知道对象在内存中的位置。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++ static constexpr 成员在类外重新声明 的相关文章

随机推荐

  • 使用 R 连接到 SSAS 多维数据集

    是否可以使用 R 查询 SQL Server Analysis Services 多维数据集 我在不同的外部服务器上有这个多维数据集 并且我正在我的计算机上工作 但我使用我的域帐户在服务器上拥有管理员权限 简而言之 我想创建一个分析服务解决
  • javascript检测字符串是否只包含unicode表情符号[重复]

    这个问题在这里已经有答案了 我正在使用以下函数来替换字符串中的表情符号 并且效果很好 function doEmoji s var ranges ud83c udf00 udfff U 1F300 to U 1F3FF ud83d udc0
  • Maven 2 checkstyle 插件版本 2.5 - configLocation 问题

    我在 maven 2 中使用 checkstyle 插件 我现在想要将我的配置文件从默认文件切换为 a 在线文件 或 b 本地文件 我尝试了以下两件事 但都不起作用 有什么建议么 A 本地文件 直接位于我的项目文件夹中的 pom xml 旁
  • 如何从 Android 设备检索 RCS 消息

    我如何在android中检索RCS消息 我可以使用 contentproviders 检索 SMS MMS 是否有适用于 Android 的 RCS 消息传递的 URI 我发现我的设备有这个 contentprovider 可用 所以我尝试
  • 如何在 NSBundle 中从 Assets.car(xcassets 的编译版本)加载图像?

    简而言之 如何从已编译的图像中加载图像Assets car在一个NSBundle 完整版本 我正在转换一套应用程序以供使用CocoaPods 每个应用程序都依赖于一个名为Core Core包括代码文件 xib文件 以及几个xcasset f
  • powershell 中的 PsObject 数组

    这是我的代码 a for i 0 i lt 5 i item New Object PSObject item Add Member type NoteProperty Name Col1 Value data1 item Add Memb
  • 如何通过 WinDBG 在 Dump 中查找非托管内存中的内容

    我在 WinDbg 命令中运行转储文件 地址 摘要 我的结果是这样的 Usage Summary RgnCount Total Size ofBusy ofTota Free 3739 7ff5 dbbae000 127 960 Tb 99
  • 如何更改prestashop中订单确认电子邮件模板的内容?

    我想更改订单确认电子邮件模板的内容 前提是已订购特定产品 有什么解决办法吗 您可以在mails language order conf html txt 中找到电子邮件订单确认的通用模板 mails languages order conf
  • IIS7 中的 DefaultAppPool 和经典 .NET AppPool 有什么区别?

    我在 IIS 中遇到超时问题 在 web config 中 会话超时设置为 60 分钟 但 20 分钟后会话结束 此问题仅在IIS7中出现 在IIS5中不会出现 经过一番调查 我发现这是由于应用程序池超时造成的 如果应用程序池有 20 分钟
  • 如何声明具有类型并实现协议的变量?

    我的应用程序有一个详细视图控制器协议 声明它们必须有一个viewModel财产 protocol DetailViewController class var viewModel ViewModel get set 我还有一些实现该协议的不
  • Facebook Messenger Bot:视频附件的大小?能有多大?

    至少在此处的文档中没有说明通过 Facebook Messenger 发送视频附件时所需的大小和格式 https developers facebook com docs messenger platform send api refere
  • 如何将变量传递到 Azure 数据工厂 REST url 查询字符串

    我是 Azure 数据工厂的新手 我有一个链接到 REST api 的源数据集 该 API 的 url 有一个查询字符串 我有一个将数据从 REST 复制到数据库的活动 但我必须在查询字符串中传递不同的值 并对不同的值运行相同的活动 如何在
  • 使用 jQuery 获得第一堂课和最后一堂课

    可能是新手问题 我有这样的代码行 div class template active 我需要为自己准备每一堂课 我尝试了这段代码 this attr class 从该代码中我得到 模板处于活动状态 我需要的是一个带有 template 的字
  • Java 中的 lambda 目标类型和目标类型上下文是什么意思?

    我正在阅读 Herbert Schildt 的 Java 完整参考 中关于 lambda 的一章 其中有很多对 lambda 目标类型 和 目标类型上下文 的引用 函数式接口定义了目标类型的一个 拉姆达表达式 这里有一个关键点 只能使用 l
  • 如何为webpack使用自己的jade文件?

    我是 webpack 的新手 并试图弄清楚如何在 webpack dev server 中使用我自己的 html 文件以及我的 webpack 构建 在我的 app js 中我有 require jade index jade 但这并不意味
  • 通过页面打开 mysql 连接是完全鲁莽的吗?

    当查询数据库时 是否会感到极度偏执 每次必须完成新查询时 我都会打开和关闭 mysql 连接 我担心 尤其是启用 ajax 的页面 这会导致性能大幅下降 我应该继续使用此方法 还是至少在每个页面 而不是每个查询 中打开和关闭连接一次 顺便说
  • 如何在vala中使用gettext?

    当我尝试在 vala 中使用 gettext 时 我没有收到来自 vala 的错误或警告 但我从 c 编译器收到以下错误 usr include glib 2 0 glib gi18n lib h 29 2 error error You
  • 单击时显示数组中的下一个图像

    我正在努力设置可以通过屏幕箭头点击的图像 目前 我的图像全部通过循环和数组显示 我已经能够进行设置 以便当您将鼠标悬停在小图像预览上时 主图像将更改为该图像 也就是说 您可以将鼠标悬停在它们上以查看更大的版本 我的数组位于 mongo 模型
  • Unity构建错误

    所以我制作了我的游戏并尝试构建它 我收到一些对我来说毫无意义的错误 这是错误 UnityEditor BuildPlayerWindow BuildMethodException 2 个错误 在 UnityEditor BuildPlaye
  • C++ static constexpr 成员在类外重新声明

    对于以下代码 为什么 main 中的第一个案例无需重新声明 Foo bar 就可以正常工作 而带有该函数的第二个案例则需要它 struct Foo static constexpr int bar 30 Declaration of Foo