C++ 为什么可以';静态constexpr成员变量不能传递给函数吗?

C++ 为什么可以';静态constexpr成员变量不能传递给函数吗?,c++,inline,c++17,constexpr,static-members,C++,Inline,C++17,Constexpr,Static Members,下面的代码生成对“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(co

下面的代码生成对“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;
}
编辑:
我正在Ubuntu 16.04上使用CLion,据我所知,它使用g++5.4进行编译。我已经将它设置为使用C++17,但仍然得到相同的错误。只有将
color
传递给函数时,才会出现此错误

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

class Test { 
   /* ... etc etc ... */
}

const constexpr Color Test::color;
静态成员的constexpr ness不允许您“放弃”此显式定义要求

使用C++17,您不再需要显式定义静态成员。它们是隐式的“内联”变量,在某个点自动定义,每个二进制文件只定义一次,而无需处理它。有关此功能的详细建议,请参见


请注意,定义必须仅出现在单个翻译单元中(因此可能不会出现在包含大量类测试的标题中)。

问题既不在于代码本身,也不在于所使用的标准。CLion的默认编译器不完全支持C++17,因此它显示出一种奇怪的行为,即它可以编译
静态constexpr
成员变量,但前提是这些变量没有传递给函数

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


谢谢你的贡献

你的编译器是什么?如果您确实使用C++17编译代码,那么这就是一个编译器错误。当我使用--std=C++14编译代码时,我也遇到了同样的错误,但使用--std=C++17时效果很好。我用的是gcc,我用的是带有Ubuntu 16.04默认编译器的CLion。我在我的
CMakeLists.txt
中设置了相应的标志:
set(CMAKE_CXX_STANDARD 17)
谢谢,我想我当时被CLion欺骗了一点,因为我可以轻松地将其设置为使用C++17,而不需要任何警告。但是,看起来,它的默认编译器甚至不支持它(完全…),谢谢,所以如果我理解正确,我根本无法将内联变量传递给函数,即使在C++17中也是如此?@user3738870:不,这实际上与他说的相反。哈哈,如果你认为这是一个很长的建议,等等,直到你看到…@Nicolas,但是在C++17中,是什么导致了同样的错误呢?只有当我尝试将其作为参数传递时…@user您的编译器还没有实现该功能吗?
class Test { 
   /* ... etc etc ... */
}

const constexpr Color Test::color;