当前位置: 首页 > 知识库问答 >
问题:

GCC 12.1常量问题是一个bug还是一个特性?“尝试使用常量对象调用非常量函数”

葛昱
2023-03-14

我们看到在GCC 11.3和Visual Studio 2022中成功编译的C代码在GCC 12.1中存在问题。该代码位于编译器资源管理器:https://godbolt.org/z/6PYEcsd1h(感谢@NathanPierson对其进行了一些简化。)

基本上,模板类决定尝试在const函数中调用非const基类函数,即使const重载可用。这似乎是某种编译器错误,但可能是一些奇怪的新C规则我不明白。这是否代表编译器错误?

struct BaseClass
{
    // Commenting this non-const function out will also fix the compilation.
    int* baseDevice() { return nullptr; }
    const int* baseDevice() const { return nullptr; }
};

template <class ObjectClass>
struct DerivedClass : BaseClass
{

};

template <class ObjectClass>
struct TopClass : DerivedClass<ObjectClass>
{
  public:
    virtual int failsToCompile() const
    {
      // This should choose to call the const function, but it tries to call the non-const version.
      if (BaseClass::baseDevice())
         return 4;

      return 1;
    }
};

int main()
{
    TopClass<int> x;
}
<source>: In instantiation of 'int TopClass<ObjectClass>::failsToCompile() const [with ObjectClass = ConcreteObject]':
<source>:27:17:   required from here
<source>:30:32: error: passing 'const TopClass<ConcreteObject>' as 'this' argument discards qualifiers [-fpermissive]
   30 |       if (BaseClass::baseDevice())
      |           ~~~~~~~~~~~~~~~~~~~~~^~
<source>:14:15: note:   in call to 'MyDevice* BaseClass::baseDevice()'
   14 |     MyDevice* baseDevice() { return nullptr; }
      |               ^~~~~~~~~~
ASM generation compiler returned: 1

共有1个答案

吴均
2023-03-14

gcc 12.1常量问题是一个bug还是一个特性

这是一只虫子。我提交了一份bug报告,该问题已经通过这次提交得到验证。

问题已经分配完毕,解决方案有一个12.2版的目标里程碑,因此我们可以期待快速修复。

 类似资料:
  • 本文向大家介绍如何判断一个常量是废弃常量 ?相关面试题,主要包含被问及如何判断一个常量是废弃常量 ?时的应答技巧和注意事项,需要的朋友参考一下 运行时常量池主要回收的是废弃的常量。那么,我们如何判断一个常量是废弃常量呢? 假如在常量池中存在字符串 "abc",如果当前没有任何 String 对象引用该字符串常量的话,就说明常量 "abc" 就是废弃常量,如果这时发生内存回收的话而且有必要的话,"a

  • 着色器语言和C语言、javascript语言一样可以通过关键字const声明一个常量。 着色器语言和其它语言一样,声明一个变量,可以重新赋值,如果通过关键字const声明一个常量,顾名思义是常量,在代码中是不可以更改的。 // 着色器语言定义一个整形常量 const int count = 10; // 定义一个浮点数常量10.0 const float count = 10.0; // 定义一个

  • 当比较整型对象和常量值时,Java是装箱还是取消装箱整型对象? 根据我读到的内容,“==”是一个引用比较,因此,假设Java将常量装箱以执行对象之间的引用比较是合乎逻辑的。然而,下面的测试代码似乎给出了矛盾的结果。 那么,使用的对象与常量值比较在Java中是如何工作的呢?在这种情况下,操作员是否按值进行比较?

  • 我试图创建一个编译时常量,这样R8就可以在最终的生产apk中省略调试代码。我遇到了一个路障,不可分配给。 进一步检查后,我发现用wrapper。 这里的问题是: 为什么不能将静态最终布尔值指定给常量值

  • 问题内容: 我努力了: 首先,声明和初始化可以正常工作,但是第二,第三和第四不起作用。如何声明和初始化浮点数的const数组? 问题答案: 数组不是天生不变的。您无法使其保持恒定。 您可以获得的最接近的是: 请注意而不是:它可确保获得(固定大小)数组而不是切片。因此值不是固定的,但大小是固定的。

  • 本文向大家介绍C++常量详解一(常量指针与常量引用的初始化),包括了C++常量详解一(常量指针与常量引用的初始化)的使用技巧和注意事项,需要的朋友参考一下 1、常量 1.1、常量的初始化: const对象一旦创建后其值就不能再改变,所以const对象必须初始化。这里我们要注意一点,像const int *p和const int &r都并不是const对象。因为const int *p只是表示不能通