我正在尝试将未知类型的默认值推入条件运算符。在大多数情况下有效
return t ? t->f() : decltype (t->f()) {};
但是,如果推断的类型是void
,则会发生编译错误。
prog.cpp: In instantiation of ‘auto call(T*) [with T = smth1]’:
prog.cpp:22:11: required from here
prog.cpp:17:12: error: compound literal of non-object type ‘void’
return t ? t->f() : decltype (t->f()) {};
~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
有没有办法将值直接放入条件语句中,或者是将其全部包装if constexpr
并复制代码的唯一选择?
if constexpr (is_void_v<decltype(t->f())>) { if (t) return t->f(); }
else return t ? x->f() : decltype(t->f()){};
完整代码:https ://ideone.com/cAlFlT
struct smth1
{
void f() {}
} a1;
struct smth2
{
int f() { return 88; }
} a2;
template <typename T> auto call(T *t)
{
return t ? t->f() : decltype (t->f()) {};
}
int main()
{
call(&a1);
call(&a2);
return 0;
}
1 个回答