海湾合作委员会错误?它莫名其妙地将数组衰减为指针,而 clang 则不会

gcc bug? It inexplicably decays array to pointer, while clang does not

这是说明问题的简化版本:

struct Foo {
    Foo() = default;

    template <std::size_t N>
    Foo(const char(&)[N]) {}
};

template <std::size_t N>
auto foo(const char (&arr)[N]) -> Foo
{
    return arr;
}

auto main() -> int
{
    foo("Stack Overflow");
}

g++ 似乎衰减 arrconst char *,尽管数组引用参数被传递给数组引用参数。它给出了这个错误:

In instantiation of Foo foo(const char (&)[N]) [with long unsigned int N = 4ul]:

error: could not convert (const char*)arr from const char* to Foo

 return arr;
        ^

虽然 clang++ 的行为符合我的预期并编译了代码。

代码在 gcc 上编译良好,具有任何这些修改:

return {arr};
return Foo(arr);
return (Foo)arr;
return static_cast<Foo>(arr);

是否是 gcc 错误?

尝试使用支持c++14.(*)

所有 g++和clang++版本

(*) 我只是用 gcc 6 的快照试了一下,它编译正常。所以它看起来确实像 gcc 6

中修复的错误

是的,这是 GCC 中的一个错误,其中数组会过早地退化为指针,并且转换构造函数似乎不再是可行的候选对象。可以在这两个错误报告的评论中找到与您的示例(以及最终修复)类似的示例: