次のコードではこの警告が発行されますが、A :: stとB :: stの両方が初期化され、実際には同じ文字列を表します。私の理解では、これは不正な形式のコードであり、コンパイルすべきではありません(私はclangをチェックしました)。 VC++が警告の代わりにエラーを出さないのはなぜですか?VC++警告C4356:派生クラスを介して静的データメンバを初期化できません
#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"
}
言語標準では、「診断」の発行についてのみ話しています。警告やエラー(または何か他のもの)と呼ばれるべきかどうかは分かりません。 –