gcc bug?它莫名其妙地将数组衰减到指针,而clang却没有

时间:2016-03-13 12:57:33

标签: c++ g++ language-lawyer c++14 clang++

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

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 ++似乎将arr衰减到const char *。它给出了这个错误:

  

实例化Foo foo(const char (&)[N]) [with long unsigned int N = 4ul]

     

错误:无法将(const char*)arrconst char*转换为   Foo

 return arr;
        ^

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

使用以下任何修改,代码在gcc上编译良好:

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

这是一个gcc bug吗?

尝试使用支持c++14所有 g ++和clang ++版本。(*)

(*)我只是用gcc 6的快照尝试了它并编译好了。所以它看起来像gcc 6

中修复的错误

1 个答案:

答案 0 :(得分:13)

是的,这是GCC中的一个错误,其中数组会过早地衰减成指针,转换构造函数将不再是可行的候选者。可以在这两个错误报告的注释中找到与您的类似(以及最终修复)的示例: