返回一个前向声明的结构未定义的行为?

ere*_*eOn 8 c++ undefined-behavior visual-c++

我有以下代码(为简单起见省略了包含保护):

= foo.hpp=

struct FOO
{
  int not_used_in_this_sample;
  int not_used_in_this_sample2;
};
Run Code Online (Sandbox Code Playgroud)

= main.cpp=

#include "foo_generator.hpp"
#include "foo.hpp"

int main()
{
  FOO foo = FooGenerator::createFoo(0xDEADBEEF, 0x12345678);

  return 0;
}
Run Code Online (Sandbox Code Playgroud)

= 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);
};
Run Code Online (Sandbox Code Playgroud)

= 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();
}
Run Code Online (Sandbox Code Playgroud)

这个代码,就目前而言,编译完全没有任何警告.如果我的理解是正确的,它应该输出:

deadbeef, 12345678
Run Code Online (Sandbox Code Playgroud)

但相反,它会随机显示:

12345678, 32fb23a1
Run Code Online (Sandbox Code Playgroud)

或者只是崩溃.

如果我更换FOO的前瞻性声明foo_generator.hpp#include "foo.hpp",那么它的工作原理.

所以这是我的问题:返回一个前向声明的结构会导致未定义的行为吗?或者什么可能出错?

使用的编译器:MSVC 9.0和10.0(都显示问题)

vis*_*tor 7

根据8.3.5.6,这应该没问题:"参数的类型或不是定义的函数声明的返回类型可能是不完整的类类型."