有人可以解释std::declval如何工作吗?
我已经在gcc headers/type_traits(第2248-2262行)中找到了此实现,该实现(做了一些清除以提高可读性):
template<typename _Tp>
struct __declval_protector
{
static const bool __stop = false;
static typename add_rvalue_reference<_Tp>::type __delegate();
};
template<typename _Tp>
typename add_rvalue_reference<_Tp>::type
declval ()
{
static_assert(__declval_protector<_Tp>::__stop, "declval() must not be used!");
return __declval_protector<_Tp>::__delegate();
}
我不了解
return __declval_protector<_Tp>::__delegate()
部分,它是否为类型T的右值引用调用默认的初始化程序?另外我不明白为什么每次我调用
static_assert
时都不调用declval
,因为__stop
始终为假(并且如何区分未评估的上下文和评估的上下文?)。编辑:
从我现在的理解来看,所有这些东西都等同于:
template<typenam _Tp>
struct __declval_protector
{
const bool __stop = false;
};
template<typename _Tp>
typename add_rvalue_reference<_Tp>::type
mydeclval ()
{
static_assert(__declval_protector<_Tp>::__stop, "declval() must not be used!");
}
但是,当然,编译器会发出我们不返回任何内容的问题。
最佳答案
你的前提是错误的。每次调用 declval
时都会调用静态断言。诀窍是你绝不能调用 declval
。它只能在未评估的上下文中使用。这就是静态断言存在的原因。
关于c++ - std::declval 如何工作?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/37843196/