相关疑难解决方法(0)

std :: result_of和decltype之间的区别

我在理解std::result_ofC++ 0x中的需求时遇到了一些麻烦.如果我理解正确,result_of则用于获取调用具有某些类型参数的函数对象的结果类型.例如:

template <typename F, typename Arg>
typename std::result_of<F(Arg)>::type
invoke(F f, Arg a)
{
    return f(a);
}
Run Code Online (Sandbox Code Playgroud)

我真的没有看到与以下代码的区别:

template <typename F, typename Arg>
auto invoke(F f, Arg a) -> decltype(f(a)) //uses the f parameter
{
    return f(a);
}
Run Code Online (Sandbox Code Playgroud)

要么

template <typename F, typename Arg>
auto invoke(F f, Arg a) -> decltype(F()(a)); //"constructs" an F
{
    return f(a);
}
Run Code Online (Sandbox Code Playgroud)

我能用这两种解决方案看到的唯一问题是我们需要:

  • 有一个仿函数的实例在传递给decltype的表达式中使用它.
  • 知道仿函数的定义构造函数.

难道我就在想,唯一的区别decltyperesult_of是而第二个不第一个需要表达?

c++ result-of decltype c++11

97
推荐指数
2
解决办法
2万
查看次数

用于C中结构和指针的malloc

假设我想定义一个表示向量长度的结构及其值,如下所示:

struct Vector{
    double* x;
    int n;
};
Run Code Online (Sandbox Code Playgroud)

现在,假设我想定义一个向量y并为其分配内存.

struct Vector *y = (struct Vector*)malloc(sizeof(struct Vector));
Run Code Online (Sandbox Code Playgroud)

我在互联网上的搜索显示我应该分别为x分配内存.

y->x = (double*)malloc(10*sizeof(double));
Run Code Online (Sandbox Code Playgroud)

但是,似乎我为y-> x分配内存两次,一次为y分配内存,另一种为y-> x分配内存,这似乎浪费了内存.如果让我知道编译器真正做了什么以及初始化y和y-> x的正确方法,我们非常感激.

提前致谢.

c memory-management

70
推荐指数
2
解决办法
22万
查看次数

评估对象的创建意味着什么?

我遇到了句子,"即使临时对象的创建未被评估",在标准12.2中,我也没有得到他们的意思.

所以我读到了关于表达的内容,但我仍然没有得到他们所说的意思.我想,原因是我很难尝试对未评估的表达式进行定义,并将其应用于上述报价.

那么任何人都可以告诉我他们的意思是"即使临时对象的创建没有得到评估"?

上下文:

类型的临时数在各种上下文中创建:绑定对prvalue的引用(8.5.3),返回prvalue(6.6.3),创建prvalue的转换(4.1,5.2.9,5.2.11,5.4) ,抛出异常(15.1),进入处理程序(15.3),以及一些初始化(8.5).[注意:异常对象的生命周期在15.1中描述. - 结束注释]即使临时对象的创建未被评估(第5条)或以其他方式避免(12.8),也应尊重所有语义限制,就好像临时对象已被创建并随后被销毁一样.[注意:即使没有调用析构函数或复制/移动构造函数,也应满足所有语义限制,例如可访问性(第11条)以及函数是否被删除(8.4.3).但是,在用作decltype-specifier(5.2.2)的操作数的函数调用的特殊情况下,不引入临时,因此前述内容不适用于任何此类函数调用的prvalue. - 结束说明]

c++ language-lawyer

5
推荐指数
1
解决办法
102
查看次数

libstdc++对std::declval的实现问题

与仅声明 的函数签名的libc++MSVC-STL不同std::declvallibstdc++定义了 的函数体std::declval,并在static_assert内部使用以确保它必须在未评估的上下文中使用:

template<typename _Tp, typename _Up = _Tp&&>
_Up 
__declval(int);

template<typename _Tp>
_Tp 
__declval(long);

template<typename _Tp>
auto 
declval() noexcept -> decltype(__declval<_Tp>(0));

template<typename _Tp>
struct __declval_protector {
  static const bool __stop = false;
};

template<typename _Tp>
auto 
declval() noexcept -> decltype(__declval<_Tp>(0)) {
  static_assert(__declval_protector<_Tp>::__stop,
    "declval() must not be used!");
  return __declval<_Tp>(0);
}
Run Code Online (Sandbox Code Playgroud)

当我们尝试评估 的返回值时std::declval,这static_assert将被触发:

auto x = std::declval<int>(); // static assertion failed: declval() must not …
Run Code Online (Sandbox Code Playgroud)

c++ metaprogramming type-traits c++20

3
推荐指数
1
解决办法
149
查看次数

什么是可能评估的表达式?

我正在阅读有关ODR使用的信息,遇到了以下问题:

除非满足以下两个条件,否则将使用可能评估的表达式ex中的变量x:

什么是可能评估的表达式

更新:向下滚动页面时,我可能只是找到答案了:

在上面的定义中,潜在赋值表示表达式不是未赋值的操作数(或其子表达式),例如sizeof的操作数,表达式e的一组潜在结果是一组id表达式(可能为空),出现在e中,组合如下:

但是不确定这是否意味着总体+我还是不太了解他们的解释。另外,为什么要说潜在结果而不是仅仅结果

c++

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