2016-04-26 20 views
3

次のコードではこの警告が発行されますが、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" 
} 
+2

言語標準では、「診断」の発行についてのみ話しています。警告やエラー(または何か他のもの)と呼ばれるべきかどうかは分かりません。 –

答えて

0

継承定義からすべてがBがAプラスいくつかの追加のものであるため 結構ですが、あなたが定義したものに思います! クラスaに静的const文字列を定義しました。 これはグローバルなので、AとBのすべてのインスタンスで同じになります。 そのため、Aの直接インスタンスでも "abcd"で初期化されます とAから派生するDがある場合Bからではなくabcd が含まれ、静的であるため「abcd」を含むBと「efgh」を含むDを定義できません 私は試していませんが、あなたが何らかのトラブルに遭遇すると確信しています ifあなたが定義します

コンパイラが警告を発するだけであっても、それはおそらくリンク順に依存してA :: stの内容になります。 "abcd"または "efgh"であるかもしれませんが、d :: stは "abcd"になります。B :: stは "efgh"になります.Bの "abcd"とDの "efgh"静的です。

関連する問題