私が理解したように、クラスは、それらが同一である限り、複数の変換単位で定義できます。そのことを念頭に置いて、次の例を検討してください。
//1.cpp
class Foo{
public:
int i;
};
void FooBar();
void BarFoo(){
Foo f;
}
int main(){
FooBar();
BarFoo();
}
//2.cpp
class Foo{
public:
std::string s;
};
void FooBar(){
Foo f;
}
これはコンパイルされ、クラッシュは発生しません。
次の変更を行う場合:
//1.cpp
Foo FooBar();
//2.cpp
Foo FooBar(){
Foo f;
return f;
}
クラッシュします。一方がクラッシュし、もう一方がクラッシュしないのはなぜですか。また、最初の例ではODRに違反していませんか?私がそうなら、なぜそれはうまくコンパイルされるのですか?