为什么不能将静态 constexpr 成员变量传递给函数?
Why can't a static constexpr member variable be passed to a function?
以下代码生成 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});
编辑:
我在 Ubuntu 16.04 上使用 CLion,据我所知,它使用 g++ 5.4 进行编译。我已将其设置为使用 C++17,但仍然出现相同的错误。该错误仅在 color
传递给函数时出现。
这是因为,在 C++17 之前,您必须在 class:
之外专门定义静态变量
class Test {
/* ... etc etc ... */
}
const constexpr Color Test::color;
静态成员的constexpr-ness不让你'waive'这个显式定义要求
使用 C++17,您不再需要显式定义静态成员。它们是隐含的 "inline" 变量,在某些时候会得到 auto-defined,并且每个二进制文件只有一次,而无需您处理。有关此功能的详细建议,请参阅 here。
请注意,该定义只能出现在 单个 翻译单元中(因此可能不会出现在 header with class 测试中).
问题既不在于代码本身,也不在于所使用的标准。 CLion 的默认编译器不完全支持 C++17,因此它表现出奇怪的行为,即可以编译 static constexpr
成员变量,但前提是它们未传递给函数。
更新到最新的编译器版本后,我能够 运行 代码成功,无需任何更改。
感谢您的贡献。
以下代码生成 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});
编辑:
我在 Ubuntu 16.04 上使用 CLion,据我所知,它使用 g++ 5.4 进行编译。我已将其设置为使用 C++17,但仍然出现相同的错误。该错误仅在 color
传递给函数时出现。
这是因为,在 C++17 之前,您必须在 class:
之外专门定义静态变量class Test {
/* ... etc etc ... */
}
const constexpr Color Test::color;
静态成员的constexpr-ness不让你'waive'这个显式定义要求
使用 C++17,您不再需要显式定义静态成员。它们是隐含的 "inline" 变量,在某些时候会得到 auto-defined,并且每个二进制文件只有一次,而无需您处理。有关此功能的详细建议,请参阅 here。
请注意,该定义只能出现在 单个 翻译单元中(因此可能不会出现在 header with class 测试中).
问题既不在于代码本身,也不在于所使用的标准。 CLion 的默认编译器不完全支持 C++17,因此它表现出奇怪的行为,即可以编译 static constexpr
成员变量,但前提是它们未传递给函数。
更新到最新的编译器版本后,我能够 运行 代码成功,无需任何更改。
感谢您的贡献。