有人可以解释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/

10-11 23:19