gpt4 book ai didi

c++ - 明确定义 'static const variable in a struct' 在 C++ 11 及更高版本中有什么区别吗?

转载 作者:搜寻专家 更新时间:2023-10-31 00:09:05 25 4
gpt4 key购买 nike

我知道在旧版本的 C++ 中,为结构中的 const static 变量 赋值而不在结构外定义它不会为变量创建内存分配,但会替换const static variable 在编译期间为其赋值并访问此类变量的地址会出错(因为该变量未定义/分配内存)

struct A{
int i;
static const int j = 20;
}

所以,这里要定义变量,应该用地址访问它

const int A::j; //line1

但是,在更高版本的 C++ 中,即使变量没有像 line1 中那样定义,内存也会被分配并且它的地址可以被获取。

我不确定在 C++ 11 的版本中添加 line1 是否会在任何其他方面产生任何差异(因为在没有此行的情况下也会分配内存)。如果它有所作为,那会是什么? (是否只是为了提供向后兼容性?)

请帮忙!!!

编辑:我不确定这种事情是否在 C++ 11 之前就被接受了,但由于我是从 C++ 11 观察到的,所以我提到了它(使用 MSVC++ 14.0)

更新:还观察到,当尝试在没有 line1 的情况下打印 j 的地址时,在 MSVC++ 14.0 中,它可以打印地址但是 code>gcc compiler (cpp.sh),它不能并且给出链接错误 (undefined reference)

最佳答案

在C++17中,将引入内联变量。类的 static constexpr 数据成员将隐式内联,并且是该数据成员的定义。多个定义将在链接时解析为该数据成员的单个地址。

在您的示例中,A::jconst 但不是constexpr,因此该规定不适用于它。您的示例在从 C++98 到 C++17 的所有版本中都可以正常工作。

jconstexpr 的情况下,在 C++17 及更高版本中,行外定义 const int A::j 将成为编译器将忽略的冗余声明。是的,这是出于向后兼容的原因。

关于c++ - 明确定义 'static const variable in a struct' 在 C++ 11 及更高版本中有什么区别吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45094680/

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