代码之家  ›  专栏  ›  技术社区  ›  user3738870 YOUSIF ALHURIYA

为什么不能将静态constexpr成员变量传递给函数?

  •  1
  • user3738870 YOUSIF ALHURIYA  · 技术社区  · 6 年前

    下面的代码生成 undefined reference to 'Test::color'

    #include <iostream>
    
    struct Color{
        int r,g,b;
    };
    
    void printColor(Color color) {
        //printing color
    }
    
    class Test {
        static constexpr Color color = {242,34,4};
    public:
        void print(){
            printColor(color);
        }
    };
    
    
    int main() {
        Test test;
        test.print();
    
        return 0;
    }
    

    这个代码为什么会产生上述错误,什么是最好的避免它的方法,考虑到我想使用标准的最新版本C++ 17?

    我是否应该定义静态成员变量,就像在标准的早期版本中一样(请参阅这里的第一个答案: Undefined reference to static constexpr char[] )或者我应该创建一个新的 Color 结构如下所示?

    printColor(Color{color.r, color.g, color.b});
    

    编辑: 我在ubuntu16.04上使用CLion,据我所知,它使用g++5.4进行编译。我已经设置它使用C++ 17,并且仍然得到相同的错误。只有当 color

    2 回复  |  直到 6 年前
        1
  •  3
  •   einpoklum    6 年前

    这是因为在C++ 17之前,您必须在类外定义静态变量:

    class Test { 
       /* ... etc etc ... */
    }
    
    const constexpr Color Test::color;
    

    静态成员的constexpr ness不允许您“放弃”这个显式定义要求。

    用C++ 17,您不再需要显式地定义静态成员。它们是隐式的“内联”变量,可以在某个点自动定义,每个二进制文件只定义一次,而无需处理它。看到了吗 here

    单一的 翻译单元(因此可能不在包含大量类测试的头中)。

        2
  •  1
  •   user3738870 YOUSIF ALHURIYA    6 年前

    static constexpr 成员变量,但前提是它们没有传递给函数。

    在更新到最新的编译器版本之后,我能够在没有任何更改的情况下成功地运行代码。