相关疑难解决方法(0)

为什么std :: declval添加引用?

std::declval是一个编译时实用程序,用于构造表达式以确定其类型.它的定义如下:

template< class T >
typename std::add_rvalue_reference<T>::type declval() noexcept;
Run Code Online (Sandbox Code Playgroud)

这不会更简单吗?

template< class T >
T declval() noexcept;
Run Code Online (Sandbox Code Playgroud)

参考返回类型的优点是什么?不应该被称为declref

我找到的最早的历史例子是n2958,它调用函数value()但总是返回一个引用.

注意,操作数decltype不需要具有可访问的析构函数,即它没有在语义上被检查为完整表达式.

template< typename t >
t declprval() noexcept;

class c { ~ c (); };
decltype ( declprval< c >() ) * p = nullptr; // OK
Run Code Online (Sandbox Code Playgroud)

c++ decltype c++11

43
推荐指数
2
解决办法
3761
查看次数

是否有一个原因,declval返回add_rvalue_reference而不是add_lvalue_reference

将类型更改为类型reference,允许访问类型的成员而不创建类型的实例.对于两者而言lvalue references,这似乎都是正确的rvalue references.

declval是用add_rvalue_reference 而不是 add_lvalue_reference,

  • 这只是一个惯例,
  • 或者是否有使用的例子add_rvalue_reference

编辑:我想我有点模糊,这些答案都非常好,但触及略有不同的点.建议使用两种不同的答案,Howard强调您可以选择您的类型具有哪种参考,使其add_rvalue_reference更加灵活.其他答案强调默认行为会自动选择更自然地反映输入类型的引用.我不知道该挑选什么!如果有人可以添加两个简单的例子,分别激励每个属性的需要,那么我会满意的.

c++ c++11

28
推荐指数
3
解决办法
2641
查看次数

在c中查找结构元素的偏移量

struct a
{
    struct b
    {
        int i;
        float j;
    }x;
    struct c
    {
        int k;  
        float l;
    }y;
}z;
Run Code Online (Sandbox Code Playgroud)

任何人都可以解释我如何找到偏移量,int k以便我们可以找到地址int i

c struct

24
推荐指数
4
解决办法
3万
查看次数

declval <T>()与(*(T*)nullptr)相同吗?

declval<T>()只为老把戏的替代品(*(T*)NULL),以获得T的实例在decltype,而无需担心T的构造函数?

以下是一些示例代码:

struct A {};

struct B {
    A a;
};

typedef decltype((*(B*)nullptr).a) T1;
typedef decltype(declval<B>().a) T2;

cout << "is_same: " << is_same<T1, T2>::value << endl;
Run Code Online (Sandbox Code Playgroud)

打印1,因为T1和T2是相同的类型.

如果declval不仅仅是替代品,那么差异是什么?它在哪里有用?

c++ decltype c++11

23
推荐指数
2
解决办法
2745
查看次数

std :: declval如何工作?

有人可以解释一下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();
}
Run Code Online (Sandbox Code Playgroud)

我不理解该部分return __declval_protector<_Tp>::__delegate(),是否为类型为T的Rvalue引用调用默认初始值设定项?另外我不明白为什么每次打电话都没有调用,因为它总是假的(它如何区分未评估的上下文和评估的上下文?).static_assertdeclval__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!");
}
Run Code Online (Sandbox Code Playgroud)

但当然编译器会发出我们不返回任何内容的问题.

c++ c++11

4
推荐指数
1
解决办法
733
查看次数

标签 统计

c++ ×4

c++11 ×4

decltype ×2

c ×1

struct ×1