我试图在编译时进行C字符串大小计算,使用如下代码:
#include <stdio.h>
#include <stdint.h>
class StringRef
{
public:
template<int N>
constexpr StringRef(const char (&str)[N])
: m_ptr(str), m_size(uint32_t(N-1)) {}
constexpr const char *constData() const
{ return m_ptr; }
private:
const char *m_ptr;
uint32_t m_size;
};
struct S
{
StringRef str;
};
constexpr static const struct S list[] =
{
"str",
};
int main()
{
printf("%s\n", list[0].str.constData());
return 0;
}
在clang-3.7中一切都很好,但在GCC 4.9.3-5.3中我得到了:
错误:无法转换&#39;(const char *)&#34; str&#34;&#39;来自&#39; const char *&#39;至 &#39; StringRef&#39;
可以通过添加显式括号来修复:
constexpr static const struct S list[] =
{{
{ "str" },
}};
但代码变得丑陋,而且仍然以某种方式正确地理解它。
如何在没有显式括号的情况下让gcc理解数组初始化?