为什么constexpr是该类型的一部分?

时间:2017-09-09 13:17:13

标签: c++ c++11 const constexpr

为什么constexpr是该行的一部分?我觉得它就像内联一样。 fg的实际类型是什么?

这有效:

void f()
{
  auto f = []() { return 42; };
  auto p = f;

  static_assert(std::is_same_v<decltype(f), decltype(p)>);
}

但这不是:

void g()
{
  constexpr auto f = []() { return 42; };
  auto p = f;

  static_assert(std::is_same_v<decltype(f), decltype(p)>);
}

https://godbolt.org/g/Di4SJ5

1 个答案:

答案 0 :(得分:5)

constexpr生成对象const,因此f的类型为const the_lambda_type,而p为非{{1} (这是从const复制的新对象。)

  

对象声明中使用的f说明符隐含constexpr

以下const没问题。

static_assert

BTW:

  

static_assert(std::is_same_v<std::remove_const_t<decltype(f)>, decltype(p)>); f的实际类型是什么?

您可以使用未定义的类模板从编译错误消息中获取实际类型,例如

g

然后

template <typename>
struct TD;

e.g。 clang的错误消息如下:

constexpr auto f = []() { return 42; };
auto p = f;

TD<decltype(f)> td1;
TD<decltype(p)> td2;

你会看到差异。