Ben*_*oît 1 c++ const constexpr c++11
为什么constexpr部分线?我觉得它就像内联一样.什么是真正的类型f的g?
这有效:
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)
constexpr使对象const,所以类型f是const 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:
什么是真正的类型
f的g?
您可以使用未定义的类模板从编译错误消息中获取实际类型,例如
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的错误信息如下:
Run Code Online (Sandbox Code Playgroud)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;
你会看到差异.
| 归档时间: |
|
| 查看次数: |
91 次 |
| 最近记录: |