为什么constexpr是该行的一部分?我觉得它就像内联一样。
f
中g
的实际类型是什么?
这有效:
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)>);
}
答案 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;
你会看到差异。