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

Ben*_*oît 1 c++ const constexpr c++11

为什么constexpr部分线?我觉得它就像内联一样.什么是真正的类型fg

这有效:

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

  static_assert(std::is_same_v<decltype(f), decltype(p)>);
}
Run Code Online (Sandbox Code Playgroud)

但这不是:

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

  static_assert(std::is_same_v<decltype(f), decltype(p)>);
}
Run Code Online (Sandbox Code Playgroud)

https://godbolt.org/g/Di4SJ5

son*_*yao 5

constexpr使对象const,所以类型fconst the_lambda_type,虽然p是无const(这是从复制一个新的对象f).

constexpr对象声明中使用的说明符暗示const.

以下static_assert情况可以.

static_assert(std::is_same_v<std::remove_const_t<decltype(f)>, decltype(p)>);
Run Code Online (Sandbox Code Playgroud)

BTW:

什么是真正的类型fg

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

template <typename>
struct TD;
Run Code Online (Sandbox Code Playgroud)

然后

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

TD<decltype(f)> td1;
TD<decltype(p)> td2;
Run Code Online (Sandbox Code Playgroud)

例如clang的错误信息如下:

prog.cc:14:21: error: implicit instantiation of undefined template 'TD<const (lambda at prog.cc:9:24)>'
    TD<decltype(f)> td1;
                    ^
prog.cc:15:21: error: implicit instantiation of undefined template 'TD<(lambda at prog.cc:9:24)>'
    TD<decltype(p)> td2;
Run Code Online (Sandbox Code Playgroud)

你会看到差异.