以下示例似乎使用Clang编译但不使用gcc编译。哪一个是对的?
#include <type_traits>
template<typename T>
struct MyType
{
constexpr MyType () = default;
//constexpr MyType () {}
constexpr bool is_int () const
{
return std::is_same_v<T, int>;
}
};
constexpr auto foo ()
{
MyType<int> retval;
//MyType<int> retval {};
return retval;
}
int main ()
{
static_assert (foo ().is_int ());
}
另外,请注意,取消注释两条注释行中的任何一行(并删除它上面的相应行),也可以使用gcc编译程序。
如果gcc就在这里,为什么不编译?
答案 0 :(得分:4)
complaint是您在constexpr函数中使用未初始化的变量。但是 - 事实并非如此,即retval
是默认初始化的。所以GCC是错误的,除非标准有非常奇怪的语言(我怀疑,但不确定)。
@StoryTeller建议这与this bug report相关。
答案 1 :(得分:0)
这是core issue 253 "Why must empty or fully-initialized const
objects be initialized?"。它由P0490R0: "Core language changes addressing National Body comments for CD C++17"(向下滚动到&#34; RU 1&#34;最后的标题)解决,恰好赶上了C ++ 17。这一变化进一步被用作&#34;缺陷报告&#34;反对C ++ 14。
您会看到&#34; new&#34;之间的实施差异。已实现此C ++ 17修复的编译器(在17和14模式下)和#34; old&#34;编译器没有。