GCC生产"无法转换"使用聚合初始化时出错

时间:2016-03-03 12:24:48

标签: c++11 gcc clang

我试图在编译时进行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理解数组初始化?

0 个答案:

没有答案