c – Constexpr:与nullptr的比较 – Bug还是功能?

GCC无法将某些表达式评估为常量.然而,Clang很不错.

/*
 */
constexpr int foo(const int * array)
{
  if (array == nullptr) // Error: '(((const int*)(& array)) == 0u)' is not a constant expression
  {
    return 0;
  }

  return 1;
}

constexpr int bar()
{
  int array[100] = {};

  return foo(array);
}

static_assert(bar() == 1, "outch..."); // Does not compile. See above.
static_assert(foo(nullptr) == 0, "okay");

constexpr int i[100] = {};
static_assert(foo(i) == 1, "okay");

也行不通:

constexpr int foobar()
{
  int array[100] = {};
  int *ar = array;
  if (ar == nullptr) // Error...
  {
    return 0;
  }
  return 1;
}

static_assert(foobar() == 1, "okay");

一样:

constexpr int foo2()
{ 
  int *a = nullptr;
  if (a == nullptr) // Error...
  {
    return 0;
  } 
  return 1;
}

static_assert(foo2() == 0, "okay");

Live Example

我的意思是,与nullptr的比较应该是与其他随机地址的比较.

你会说:这是一个错误还是一个解释问题?对我来说,很难为两个编译器编写相同的代码……

GCC 5.0到5.4发生此错误.在GCC 6中,只有foobar()不能编译.

最佳答案
这已经为gcc-7修复了.我打开了:
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=77539
要求后退.

转载注明原文:c – Constexpr:与nullptr的比较 – Bug还是功能? - 代码日志