这是一个说明问题的简化版本:
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*)arr
从const 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
答案 0 :(得分:13)
是的,这是GCC中的一个错误,其中数组会过早地衰减成指针,转换构造函数将不再是可行的候选者。可以在这两个错误报告的注释中找到与您的类似(以及最终修复)的示例: