std :: declval如何工作?

时间:2016-06-15 18:32:27

标签: c++ c++11

有人可以解释一下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 类型的Rvalue引用调用默认初始值设定项? 另外,我不明白为什么每次调用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!");
}

但是编译器当然会发出我们不返回任何内容的信息。

1 个答案:

答案 0 :(得分:16)

  

我不明白为什么每次调用declval都不会调用static_assert,因为__stop总是为假

你的前提是错的。每次调用declval时,确实会调用静态断言 。诀窍是你绝不能打电话给declval 。它必须仅用于未评估的上下文中。这就是静态断言存在的原因。