gpt4 book ai didi

c++ - 为什么只能在 C++ 类中初始化整数或枚举类型?

转载 作者:可可西里 更新时间:2023-11-01 16:38:06 25 4
gpt4 key购买 nike

我不明白为什么 C++ 只允许在类声明中定义整型和枚举(枚举也是整型)。而所有其他类型,包括浮点类型(即 double 和 float),都必须在类声明之外定义。显然这一定是一个原因,但我无法弄清楚。

代码示例:

#include <iostream>

using namespace std;

struct Node {

static const int c = 0; // Legal Definition
static const long l = 0l; // Legal Definition
static const short s = 0; // Legal Definition

static const float f = 0.0f; // Illegal definition
static const string S = "Test"; // Illegal definition

static const string JOB_TYPE; // Legal declaration
static const float f; // Legal declaration
static const double d; // Legal declaration
};

const string Node::JOB_TYPE = "Test"; // correct definition
const float Node::f = 0.0f; // correct definition
const double Node::d = 0.0; // correct definition

int main() {

cout << Node::c << endl;
cout << Node::c << endl;

cout << Node::JOB_TYPE << endl;

cout << Node::f << endl;

}

最佳答案

这里的关键原因是整数类型(和 enum 因为在编译器内部它们变成某种整数)可以被简单地替换并直接用作常量。

换句话说,struct S { static const int x = 42;} , 如果编译器看到 S::x , 它可以立即用常量 42 替换它在生成的代码中。这并不(总是)适用于float , 当然不是依赖于构造函数的类型,例如 std::string - 编译器无法为 std::string 分配内存不打电话 new (或 std::string::allocator )。因此,对于必须“构造”和/或具有更复杂的使用标准的常量(想想没有硬件支持浮点的处理器 - 加载和存储浮点值的函数调用,等),语言不能规定它应该被允许这样做。

如果您包含 struct Nodestatic const std::string S = "test"; 声明, 编译器应该存储多少个地方 Node::S在?当它最终将您的三个翻译单元链接到一个程序中时,它应该使用哪一个——还是应该使用不同的翻译单元?如果你 const_cast 会发生什么Node::S并修改它?后者假设你有一个不会导致崩溃的环境,这是完全合理的,虽然这是未定义的行为,但我不确定编译器是否应该让它像在每个翻译单元中使用不同的值一样奇怪那种情况...

编辑:如评论中所述,C++11 确实允许以类似方式使用更多类型,因此随着编译器和硬件技术的改进,限制正在放宽。我怀疑你永远无法static const std::map<X, Y> a = { ... } tho',因为这是一个相当复杂的数据类型来构建......

关于c++ - 为什么只能在 C++ 类中初始化整数或枚举类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34839315/

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