c++ - c++11:为什么静态 constexpr 的类内初始化不是定义?
问题描述
考虑以下简单:
#ifndef TEST_H
#define TEST_H
class Test {
public:
static constexpr int a = 1;
}
#endif
笔记:
- 由于宏,没有违反 ODR。
- 为什么 constexpr static int a 不被视为定义,因为它是在类 Test 中定义的?因为它不是一个定义,因此它需要类之外的以下内容。为什么?
constexpr int 测试::a;
解决方案
为什么静态 constexpr 的类内初始化不是定义?
由于一个定义规则 (ODR)。该规则规定,每个非内联非成员变量和静态成员变量都必须有一个定义。由于其性质,类定义通常包含在多个翻译单元中。如果类定义包含变量定义,则包含到多个翻译单元中将违反 ODR。
从 C++17 开始,该语言具有内联变量,因此您可以在类定义中定义此类内联变量。
推荐阅读
- properties - EWS Java Api - 设置/获取的扩展属性和权限
- java - Java中使用数组的方法
- azure - 如何在 azure 中托管 .net core 2.1 通用主机
- replace - ClojureScript 中的 clojure.string/replace 与 .replace 有什么区别?
- google-app-engine - Google Analytics Audiences 未正确与 Google Ads 同步。
- oauth-2.0 - 对于我的情况,我应该使用哪种 Oauth2 授权类型?
- android - 如何在没有 USB 连接到设备的情况下分析 Android 应用程序?
- octobercms - OctoberCMS 翻译 YAML 默认文本
- d3.js - D3不适用于动态创建的html svg
- javascript - 为什么日期选择器在 angularjs + bootstrap 中没有显示红色边框?