从函数返回类型中删除const是否会破坏ABI?

Pet*_*etr 7 c++ const abi

假设我有一个声明函数返回const类型的库:

class Foo { ... };
const Foo makeFoo();
Run Code Online (Sandbox Code Playgroud)

现在我想constmakeFoo()返回类型中删除(请参阅我之前的问题).我可以const从头文件和cpp文件中删除它们,重建库,并将我的代码链接到新库.但是,我还有动态链接到此库的旧代码,我希望它继续使用新版本的库.

那么,第一个问题,是否const从返回类型中删除了ABI?

第二个问题,实际代码是完全不同的:它是一个具有静态成员函数的模板类,稍后将显式实例化:

// fooMaker.h
template<class Foo>
class FooMaker {
public:
    static const Foo make();
};

// fooMaker.cpp
template<class Foo>
const Foo FooMaker<Foo>::make() { ... }

template class FooMaker<Foo1>;
template class FooMaker<Foo2>;
Run Code Online (Sandbox Code Playgroud)

它改变了什么吗?

如果这很重要,我在linux下使用g ++.

Sme*_*eey 1

以下关于影响 ABI 的因素的指南表明答案是肯定的,它确实破坏了 ABI 兼容性:

你不能

...

对于任何类型的现有函数:

  • 以任何方式更改返回类型

由于您要将返回类型从 更改const FooFoo我会说这是犯规的。

  • 在这种情况下,这个答案是不够的。更改是否有意义足以影响 ABI(返回 const 类型实际上没有任何作用)并不明显。 (5认同)