私は次のコードを持っています(簡単にするためにインクルードガードは省略されています):
= foo.hpp
=
struct FOO
{
int not_used_in_this_sample;
int not_used_in_this_sample2;
};
= main.cpp
=
#include "foo_generator.hpp"
#include "foo.hpp"
int main()
{
FOO foo = FooGenerator::createFoo(0xDEADBEEF, 0x12345678);
return 0;
}
= foo_generator.hpp
=
struct FOO; // FOO is only forward-declared
class FooGenerator
{
public:
// Note: we return a FOO, not a FOO&
static FOO createFoo(size_t a, size_t b);
};
= foo_generator.cpp
=
#include "foo_generator.hpp"
#include "foo.hpp"
FOO FooGenerator::createFoo(size_t a, size_t b)
{
std::cout << std::hex << a << ", " << b << std::endl;
return FOO();
}
このコードは、現状では、警告なしで完全に正常にコンパイルされます。私の理解が正しければ、次のように出力されます。
deadbeef, 12345678
ただし、代わりにランダムに表示されます。
12345678, 32fb23a1
または単にクラッシュします。
FOO の前方宣言を に置き換えるfoo_generator.hpp
と#include "foo.hpp"
、機能します。
だからここに私の質問があります: 前方宣言された構造を返すと、未定義の動作が発生しますか? または、何がうまくいかない可能性がありますか?
使用するコンパイラ: MSVC 9.0 および 10.0 (どちらも問題を示しています)