以下代码发出此警告,但它似乎工作正常,因为 A::st 和 B::st 都已初始化并且实际上代表相同的字符串。据我了解,这是格式错误的代码,不应编译(我检查了 clang)。我想知道为什么 VC++ 不发出错误而是发出警告?
#include <string>
#include <iostream>
class A
{
public:
static const std::string st;
};
class B : public A
{
};
const std::string B::st = "abcd"; //warning C4356: 'A::st': static data member cannot be initialized via derived class
int main()
{
std::cout << A::st << std::endl; // outputs "abcd"
std::cout << B::st << std::endl; // outputs "abcd"
}
最佳答案
从继承定义来看一切都很好 因为 B 是 A 加上一些额外的东西,但是想想你定义了什么! 您在类 a 中定义了一个静态常量字符串。 因为它是静态的,所以它是全局的,并且对于 A 和 B 的所有实例都是相同的。 因此,即使是 A 的直接实例也将使用“abcd”进行初始化 如果你有一个也从 A 但不是从 B 派生的 D 它将包含 abcd 并且因为它是静态的,所以您无法定义包含“abcd”的 B 和包含“efgh”的 D 我没有试过,但我很确定你会遇到一些麻烦 如果你定义
clase D :public A
{
};
const std:string d:st = "efgh";
即使编译器只发出警告,它也可能取决于链接顺序 A::st 的内容。 它可能是“abcd”或“efgh”,但 d::st 将是“abcd”或 B::st 将是“efgh” 您无法为 B 定义“abcd”,为 D 定义“efgh”,因为它是静态的。
关于c++ - VC++ 警告 C4356 : static data member cannot be initialized via derived class,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36856874/