使用嵌套结构启用lto的C ++ ODR警告

时间:2018-09-08 10:23:45

标签: c++ stl typedef one-definition-rule lto

在我的一个项目中启用lto后,编译器开始向我抛出违反lto的警告。 经过一些测试,可以归结为这种构造。

typedef struct {
    typedef struct {
    } test_t;
    std::vector<test_t> t;
} test2_t;

一旦我将其更改为

struct test2_t {
    typedef struct {
    } test_t;
    std::vector<test_t> t;
};

typedef struct {
    typedef struct {
    } test_t;
    test_t t;
} test2_t;

警告消失了,但我真的不明白为什么。我的猜测是,它将匿名结构视为不同文件中的不同类型,但是我不希望收到警告,因为这是一个常见的用例。请注意,如果我更改内部typedef但将外部保留在原处,这没有什么区别。 test_t是否包含成员也无关紧要。

  • 此警告的原因是什么?
  • 这是预期的行为吗?
  • 这可能是STL错误,因为它在没有向量的情况下也可以正常工作吗?

0 个答案:

没有答案