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

标签 c++ constants abi

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

class Foo { ... };
const Foo makeFoo();

现在我想从 makeFoo() 返回类型中删除 const(参见我的 previous question)。我可以从头文件和 cpp 文件中删除 const,重建库,并将我的代码链接到新库。但是,我也有动态链接到这个库的旧代码,我希望它继续与新版本的库一起工作。

那么,第一个问题,从返回类型中删除 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>;

它改变了什么吗?

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

最佳答案

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

You cannot

...

For existing functions of any type:

  • changing the return type in any way

由于您正在将返回类型从 const Foo 更改为 Foo 我会说这是犯规的。

关于c++ - 从函数返回类型中删除 const 是否会破坏 ABI?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37547651/

相关文章:

c++ - std::strtol 和 std::stoi 之间有什么区别?

c++ - C++ 中的 'static' 关键字

c++ - Apple clang 编译器版本控制架构?

c++ - 使用 C++11 与 GCC 4.8 默认会导致私有(private)继承和提升的链接错误

java - 将 ArrayList 对象声明为 final 以在常量文件中使用

c - 在与 ARM 架构兼容的 ELF 文件中查找 C 结构的地址

c++ - 你应该如何防御?

c++ - 带空终止符的指针数组交互

PHP5.6 CLASS常量中允许数组

C++ 通过常量引用传递结构