【发布时间】:2015-04-01 18:13:08
【问题描述】:
==> 在coliru 上查看完整的 sn-p 代码和编译。
我有一个LiteralType 类填充constexpr requirements:
struct MyString
{
constexpr MyString(char const* p, int s) : ptr(p), sz(s) {}
constexpr char const* data() const { return ptr; }
constexpr int size() const { return sz; }
char const *ptr = 0;
int const sz = 0;
};
我将它用作constexpr static 成员变量:
struct Foo
{
int size() { return str_.size(); }
constexpr static MyString str_{"ABC",3};
};
int main()
{
Foo foo;
return ! foo.size();
}
但链接器说:
(Clang-3.5 和 GCC-4.9)
undefined reference to `Foo::str_'
我要定义constexpr static成员!
(我没有指定构造函数参数)
constexpr MyString Foo::str_;
但是,如果 constexpr static 成员是 int,则不必在类定义之外定义该成员。这是我的理解,但我不确定……
问题:
- 为什么
int不需要在类声明之外定义,而MyString需要这个? - 在头文件中定义
constexpr static成员是否有缺点?
(我只提供我的库作为头文件)
【问题讨论】:
-
感谢@ShafikYaghmour 的链接。我不知道
odr-used。请您在答案中提供更多信息。您还可以解释是否建议在头文件中定义成员...干杯 -
static const int 在 c++11 之前就已经是特殊情况了。即使那样,如果您需要静态 const int 的地址,除了声明之外,您还必须提供定义。
-
完美@DaleWilson 我理解:-) 但是我是否还必须在我的库中提供一个“.cpp”文件?
标签: c++ c++11 static-members c++14 constexpr