为什么默认的构造函数不是constexpr?

时间:2018-03-18 09:22:51

标签: c++ constructor c++17 constexpr

以下示例似乎使用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就在这里,为什么不编译?

2 个答案:

答案 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;编译器没有。