gpt4 book ai didi

c++ - 本地结构通过使用通用模板函数影响不同的翻译单元

转载 作者:行者123 更新时间:2023-11-30 03:33:50 26 4
gpt4 key购买 nike

我遇到过一种情况,我不确定它是否可以被视为代码中的错误、编译器/链接器的错误/误用或对 C++ 标准的一些误解。

两个不同的源文件(包含实际代码中的单元测试)声明了一个具有相同名称但成员(略微)不同的结构。两个源文件都引用了一个包含辅助方法的 header ,该辅助方法是模板化的并返回模板的 vector (在实际代码中执行反序列化)。

在没有错误或警告的情况下进行编译后,我意识到该模板仅针对一种类型进行了专门处理,并在两种翻译单元中都使用了(尽管这些类型已在 .cpp 文件中声明),从而导致错误的结果。

下面是一个简短的概念证明:

Main.cpp

#include <iostream>
#include <string>

#include "Header.h"

struct Foo
{
std::string name = "FooMain";
};

void test1()
{
auto v = getVector<Foo>();
std::cout << v[0].name << ' '
<< v[1].name << '\n';
}

void test2();

int main()
{
test1();
test2();
}

第二个.cpp

#include <iostream>
#include <string>

#include "Header.h"

struct Foo
{
std::string name = "FooSecond";
int extraInfo = 1;
};

void test2()
{
auto v = getVector<Foo>();
std::cout << v[0].name << ' ' << v[0].extraInfo << ' '
<< v[1].name << ' ' << v[1].extraInfo << '\n';
}

Header.h

#ifndef _HEADER_H_
#define _HEADER_H_

#include <vector>

template<typename T>
auto getVector()
{
std::vector<T> result;

result.push_back({});
result.push_back({});

return result;
}

#endif

在 Visual Studio 2015 和 gcc 4.9.2(32 位,Windows)下的输出是(每次数字都不同)

FooMain FooMain
FooMain 1299148614 FooMain 1097202845

注释掉 test1() 的代码会使 test2() 返回 FooSecond 1 FooSecond 1 的预期输出。

知道是什么原因造成的吗?谢谢

最佳答案

你有UB ; C++14 [basic.def.odr]/4:

Every program shall contain exactly one definition of every non-inline function or variable that is odr-used in that program; no diagnostic required.

和/6:

There can be more than one definition of a class type (Clause 9) … in a program provided that each definition appears in a different translation unit, and provided the definitions satisfy the following requirements. Given such an entity named D defined in more than one translation unit, then

  • each definition of D shall consist of the same sequence of tokens; and

… If the definitions of D satisfy all these requirements, then the behavior is as if there were a single definition of D. If the definitions of D do not satisfy these requirements, then the behavior is undefined.

关于c++ - 本地结构通过使用通用模板函数影响不同的翻译单元,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42518258/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com