首页 > 解决方案 > 当数组声明为 constexpr 时,为什么我不能使用整数变量作为数组键?

问题描述

由于我不明白的原因,我可以constexpr使用硬编码的整数文字作为索引访问数组的成员,但是一旦我尝试使用整数变量,它就无法编译并出现错误undefined reference。但是aIvoryKeys在范围内,我们可以通过硬编码值看到这一点。

class KeyboardKey{
   
public:
   
   static constexpr unsigned short int aIvoryKeys[] {0,2,4,5,7,9,11};
   
   void ShowIvory(){   
      
      // Hardcoded values work:
      std::cout << "aIvoryKeys " << aIvoryKeys[0] << std::endl; // 0
      std::cout << "aIvoryKeys " << aIvoryKeys[1] << std::endl; // 2
      std::cout << "aIvoryKeys " << aIvoryKeys[2] << std::endl; // 4
      
      // FAILS: undefined reference to `KeyboardKey::aIvoryKeys'
      int j = 2;
      std::cout << "aIvoryKeys " << aIvoryKeys[j] << std::endl; 
      
      // FAILS: undefined reference to `KeyboardKey::aIvoryKeys'
      for(int i=0;i<std::size(aIvoryKeys);++i){         
         std::cout << "aIvoryKeys " << aIvoryKeys[i] << std::endl;
      }
      
   }
   
};

如果static constexpr从声明中删除,它将编译并运行。

问题是,为什么声明一个数组static constexpr似乎会阻止使用局部变量来访问它的成员?该变量是函数的本地变量,不需要任何运行时信息。无论如何,一个constexpr数组应该可以在运行时访问(它只是不会改变)。

标签: c++constexpr

解决方案


“硬编码值有效”

其实没有,clang 点出了问题Demo

在所有情况下,aIvoryKeys都使用 ODR,因此需要定义。

C++17aIvoryKeys inline解决了这个问题。


推荐阅读