海湾合作委员会错误?它莫名其妙地将数组衰减为指针,而 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++ 似乎衰减 arr
到 const 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 中的一个错误,其中数组会过早地退化为指针,并且转换构造函数似乎不再是可行的候选对象。可以在这两个错误报告的评论中找到与您的示例(以及最终修复)类似的示例:
这是说明问题的简化版本:
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 *
,尽管数组引用参数被传递给数组引用参数。它给出了这个错误:
In instantiation of
Foo foo(const char (&)[N]) [with long unsigned int N = 4ul]
:error: could not convert
(const char*)arr
fromconst char*
toFoo
return arr; ^
虽然 clang++ 的行为符合我的预期并编译了代码。
代码在 gcc 上编译良好,具有任何这些修改:
return {arr};
return Foo(arr);
return (Foo)arr;
return static_cast<Foo>(arr);
是否是 gcc 错误?
尝试使用支持c++14
.(*)
(*) 我只是用 gcc 6
的快照试了一下,它编译正常。所以它看起来确实像 gcc 6
是的,这是 GCC 中的一个错误,其中数组会过早地退化为指针,并且转换构造函数似乎不再是可行的候选对象。可以在这两个错误报告的评论中找到与您的示例(以及最终修复)类似的示例: